Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <algorithm>
- using namespace std;
- // INDEKSIRANJE POCINJE OD JEDINICE //
- class beli {
- int brojClanova;
- double *niz;
- void ProvjeraIspravnosti (int indeks) {
- if (indeks < 0 || indeks > brojClanova)
- throw::range_error("Pogresan indeks elementa!");
- }
- template <typename IterTip>
- friend int BrojNeparnih (IterTip p1, IterTip p2); // DA SE NE BI MOGLE POZVATI IZ OSTATKA PROGRAMA //
- template <typename IterTip>
- friend int BrojParnih(IterTip p1, IterTip p2);
- template <typename IterTip>
- friend void ZamijeniParne (IterTip p1, IterTip p2, int vrijednost);
- template <typename IterTip>
- friend void IzbrojiParne (IterTip p1, IterTip p2, int &brParnih);
- template <typename IterTip, typename IterTip2>
- friend void IzbaciNeParne (IterTip p1, IterTip p2, IterTip2 q1, IterTip2 q2);
- public:
- explicit beli (int brClanova);
- ~beli () { delete []niz;}
- beli (const beli &b);
- beli &operator= (const beli &b);
- beli (beli &&b);
- beli (initializer_list<double> lista); // INICIJALIZACIJA PUTEM ZAGRADA //
- beli &PomnoziNiz (int broj);
- beli &ProsiriNiz (int novaDimenzija);
- void Ispisi () const;
- beli &DodajClan (int vrijednost);
- beli &DodajIspred (int vrijednost);
- beli &ukloniNeParne ();
- beli &ukloniParne();
- beli &SortirajUnazad () {sort(pocetak(), kraj(), [](int a, int b) {return b < a;}); return *this;};
- beli &SortirajNiz () { sort(this->pocetak(), this->kraj()); return *this;}; // NUDI FLEKSIBILNOST KLASI, MOZE SE PISATI niz.sortiraj().Ispisi(); //
- void brParnih ();
- void brNeparnih ();
- beli &promjeniParne (int vrijednost);
- beli &PostaviDimenziju (int indeks, int vrijednost); // MOGUC LANCANI POZIV METODE //
- double DajElement (int indeks) const; // POZIVA SE SAMO NA KONSTANTNIM OBJEKTIMA //
- double &DajElement (int indeks); // MOGUCE PROMJENITI VRIJEDNOST //
- double *pocetak () { return niz; };
- double *kraj () { return niz+brojClanova;};
- double DajVelicinu () const { return brojClanova;};
- void velicinaNiza () const { cout << "(" <<brojClanova <<")";};
- void IspisiElement(int element) {ProvjeraIspravnosti(element); cout << "(" <<niz[element-1] << ")"; cout <<endl;}
- };
- template <typename Tip>
- bool Paran (Tip broj) {
- return ((int)broj%2==0);
- }
- template <typename IterTip>
- int BrojParnih (IterTip pocetak, IterTip kraj) {
- int brojac(0);
- while (pocetak != kraj) {
- if (Paran(*pocetak))
- brojac++;
- pocetak++;
- }
- return brojac;
- }
- template <typename Tip>
- bool Neparan (Tip broj) {
- return ((int) broj % 2 != 0);
- }
- template <typename IterTip>
- int BrojNeparnih(IterTip p1, IterTip p2) {
- int brojac(0);
- while (p1 != p2) {
- if (Neparan(*p1))
- brojac++;
- p1++;
- }
- return brojac;
- }
- template <typename IterTip>
- void IzbrojiParne(IterTip p1, IterTip p2, int &brojac) {
- brojac = 0;
- while (p1 != p2) {
- if (Paran(*p1))
- brojac++;
- p1++;
- }
- }
- template <typename IterTip, typename IterTip2>
- void IzbaciParne(IterTip p1, IterTip p2, IterTip2 q1, IterTip2 q2) {
- while (p1 != p2) {
- if (!Paran(*p1)) {
- *q1 = *p1;
- q1++;
- }
- p1++;
- }
- }
- template <typename IterTip, typename IterTip2>
- void IzbaciNeParne (IterTip p1, IterTip p2, IterTip2 q1, IterTip2 q2) {
- while (p1 != p2) {
- if (Paran(*p1)) {
- *q1 = *p1;
- q1++;
- }
- p1++;
- }
- }
- beli& beli::ukloniNeParne() {
- int noviBroj(BrojParnih(pocetak(), kraj()));
- try {
- double *noviNiz(new double[noviBroj]);
- fill(noviNiz, noviNiz+noviBroj, 0);
- IzbaciNeParne(pocetak(), kraj(), noviNiz, noviNiz+noviBroj);
- delete [] niz; // DAL JE POTREBNA OVA LINIJA KODA, KADA BUDES CITAO ZASTANI PA POGLEDAJ AKO NIJE PROBLEM //
- niz = noviNiz; brojClanova = noviBroj;
- }
- catch(...) {
- cout << "Problem sa alokacijom!";
- }
- }
- beli& beli::ukloniParne() {
- int noviBroj(BrojNeparnih(pocetak(), kraj()));
- try {
- double *noviNiz(new double[noviBroj]);
- fill(noviNiz, noviNiz+noviBroj, 0);
- IzbaciParne(pocetak(), kraj(), noviNiz, noviNiz+noviBroj);
- delete [] niz; // ISTO PITANJE //
- niz = noviNiz; brojClanova = noviBroj;
- }
- catch(...) {
- cout << "Greska u alokaciji!";
- }
- }
- template<typename IterTip>
- void ZamijeniParne(IterTip p1, IterTip p2, int vrijednost) {
- while (p1 != p2) {
- if (Paran(*p1))
- *p1 = vrijednost;
- p1++;
- }
- }
- void beli::brParnih() {
- cout << "[" << BrojParnih(this->pocetak(), this->kraj()) << "]"; cout<<endl;
- }
- void beli::brNeparnih() {
- cout << "[" << BrojNeparnih(this->pocetak(), this->kraj()) << "]"; cout <<endl;
- }
- beli& beli::promjeniParne(int vr) {
- ZamijeniParne(this->pocetak(), this->kraj(), vr);
- return *this;
- }
- beli &beli::PomnoziNiz(int vrijednost) {
- for (int i=0; i<this->DajVelicinu(); i++)
- niz[i] *= vrijednost;
- return *this;
- }
- beli& beli::DodajClan(int vrijednost) {
- double *novi(new double[brojClanova+1]);
- fill(novi, novi+brojClanova+1, 0); // DA NE BI DOBILI NEDEFINISANE VRIJEDNOSTI //
- copy(niz, niz+brojClanova, novi);
- niz = novi; brojClanova +=1;
- PostaviDimenziju(brojClanova, vrijednost);
- return *this;
- }
- beli &beli::DodajIspred(int vrijednost) {
- double *novi(new double[brojClanova+1]);
- fill(novi, novi+brojClanova+1, 0);
- copy(niz, niz+brojClanova, novi+1);
- niz = novi; brojClanova+=1;
- PostaviDimenziju(1, vrijednost);
- return *this;
- }
- beli::beli(const beli &b) : brojClanova(b.brojClanova), niz(new double[b.brojClanova]){
- copy(b.niz, b.niz+b.brojClanova, niz); // MOGUCE I SA PETLJOM, OVO JE SIGURNIJI NACIN //
- }
- beli &beli::operator=(const beli &b) {
- if (b.brojClanova > brojClanova || b.brojClanova < brojClanova) {
- double *novi(new double[b.brojClanova]);
- delete []niz; niz = novi;
- }
- brojClanova = b.brojClanova;
- copy(b.niz, b.niz+b.brojClanova, niz);
- return *this;
- }
- beli::beli(beli &&b) : brojClanova(b.brojClanova), niz(b.niz) { // MOVE SEMANTIKA, PRIMA SE R-VALUE VR(Privremeni objekt) //
- b.niz = nullptr;
- }
- beli::beli(int brClanova): brojClanova(brClanova), niz(new double[brClanova]) {
- fill(niz, niz+brClanova, 0);
- }
- beli::beli(initializer_list<double> lista): brojClanova(lista.size()), niz(new double[lista.size()]) {
- copy(lista.begin(), lista.end(), niz);
- }
- void beli::Ispisi() const {
- cout << "[";
- for (int i=0; i<brojClanova; i++) {
- cout << niz[i];
- if (i != brojClanova - 1)
- cout << ",";
- }
- cout << "]";
- cout <<endl;
- }
- beli& beli::ProsiriNiz(int noviBrojClanova) {
- if (noviBrojClanova <= brojClanova)
- throw::domain_error("Unesena dimenzija je manja ili jednaka prethodnoj!");
- else {
- double *noviNiz(new double[noviBrojClanova]);
- copy(niz, niz+brojClanova, noviNiz);
- fill(noviNiz+brojClanova, noviNiz+noviBrojClanova, 0);
- delete [] niz;
- niz = noviNiz;
- }
- brojClanova = noviBrojClanova;
- return *this;
- }
- beli& beli::PostaviDimenziju(int indeks, int vrijednost) {
- try {
- ProvjeraIspravnosti(indeks);
- }
- catch(...) {
- cout << "Pogresan indeks!" <<endl;
- }
- niz[indeks-1] = vrijednost;
- return *this;
- }
- double beli::DajElement(int indeks) const {
- return niz[indeks-1];
- }
- double& beli::DajElement(int indeks) {
- return niz[indeks-1];
- }
- int main() {
- beli niz(3);
- niz.PostaviDimenziju(1, 3);
- niz.PostaviDimenziju(2, 6);
- niz.PostaviDimenziju(3, 8);
- niz.Ispisi();
- niz.brNeparnih();
- niz.brParnih();
- niz.PomnoziNiz(3).Ispisi();
- niz.DodajClan(5).DodajIspred(-5).Ispisi();
- niz.promjeniParne(10).Ispisi();
- niz.SortirajNiz().Ispisi();
- niz.ukloniParne().Ispisi();
- niz.ProsiriNiz(10).Ispisi();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement