Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija

[es] :: C/C++ programiranje :: C/C++ za početnike :: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija

Strane: 1 2

[ Pregleda: 4660 | Odgovora: 33 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija21.12.2007. u 21:34 - pre 199 meseci
Početnik sam u cpp-u,
trebam savjet u vezi rešenja zadatka;



zadatak je sledeći:

Definisati klasu Bin koja omogućuje manipulaciju prirodnim brojevima u binarnom brojnom sistemu. Svaki objekat ove klase karakteriše niy binarnih cifara. Maksimalan broj cifara u nekom objektu ove klase treba da definiše jedan zajednički privatni atribut dim.
Klasa treba da sadrži sljedeće funkcije članice(unutar definicije klase navesti prototipove funkcije članice, a definicije iznan definicije klase):

1. konstruktor koji podrazumjevano kreira binarni podatak čija je vrijednost 0. Inače, binarni podatak može da se inicijalizuje na osnovu cjelobrojne vrijednosti koju konstruktor može da primi kao argument.
2. operatorska funkcija za kastovanje binarnog podatka u tip int.
3. operatorska funkcija kojom se preklapa operator >, a koja vraća rezultat poređenja dva binarna podatka. Funkcija ne treba da ispisuje, nego da vrati odgovarajući rezultat.
4. operatorska funkcija kojom se preklapa operator ~, a koja vraca kao rezultat binarni podatak koji bi se dobio komplementiranjem datog binarnog broja. treba da vrati odgovarajući rezultat, ne da ga ispise.
5. operatorska funkcija kojom se preklapa operator za prefiksno inkrementovanje binarnog podatka.

Klasa treba da ima i sledeće prijateljske funkcije:
1. operatorska funkcija kojom se preklapa operator <<, a koja ispisuje binarni podatak. Omogućiti kaskadno povezivanje.
2. operatorska funkcija kojom se preklapa operator >>, a koja direktno ucitava binarni podatak kao bilo koji podatak nekog standardnog tipa. Omogućiti kaskadno pozivanje.
3. cifra koja ima mogućnosti da prebroji i kao rezultat vrati broj jedinica u nekom binarnom podatku. Funkcija ne treba da ispisuje, nego da vrati odgovarajući rezultat.

U main-u treba:
1. omogućiti korisniku da postavi maksimalan broj cifara u binarnim podacima.
2. sa standardnog ulaza učita niz(A) binarnih podataka(niz A može da sadrži do 100 elemenata, a treba da se alocira statički). Zatim na standardnom izlazu ispisati taj niz binarnih podataka.
3. sa standardnog ulaza učitavati niz prirodnih brojeva, dok se ne unese 0, pa na osnovu njega formirati niz(B) binarnih podataka koji su ekvivalentni učitanim brojevima(niz B se alocira dinamički). Potom na standardnom izlazu ispisati niz B u opadajućem (nerastućem) redosljedu.
4. Formirati niz C kojeg čine drugi komplement binarnih podataka iz niza B (inkrementovan prvi komplement), pa ispisati taj niz.

primjer programa:

___________________________
Unesite DIM? 5

Koliko ima binarnih podataka u nizu A? 3
1. podatak? 1100
2. podatak? 101
3. podatak? 10001
Niz A: 01100 00101 10001

Unesite 1. prirodan broj? 12
Unesite 2. prirodan broj? 3
Unesite 3. prirodan broj? 8
Unesite 4. prirodan broj? 1
Unesite 5. prirodan broj? 0
Niz B u nerastućem redosljedu:
01100 01000 00011 00001

1. komplement: 10011 10111 11100 11110
2. komplement: 10100 11000 11101 11111

[Ovu poruku je menjao fresh.bm dana 22.12.2007. u 12:09 GMT+1]
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp247.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija22.12.2007. u 11:48 - pre 199 meseci
OK, procitao sam zadatak ... Samo ne kontam sta oko cega ti treba pomoc, jer nisi naveo sta ti je jasno,a sta nije! Razumijes li preklapanje operatora? Dinamicku alokaciju? Klase, friend princip? De malo opisi oko cega ti tacno treba pomoci, jer je sve lijepo opisano u zadatku sta treba da se uradi... Nakon toga, tu smo za sve ostalo!

Btw, sto se tice samog zadatka, moje misljenje je da je najbolje da spremas binarne brojeve u varijable tipa string, tako da mozes jednostavno da pristupas pojedinim ciframa, kao i da manipulises obicnom string rijeci. Pretvaranje iz string->int bi bilo takodjer jednostavno na ovaj nacin, ako netko ima bolji prijedlog neka kaze.

Sam izgled klase bi bio nesto ovako:

Code:


class Bin
{
 string binarni_broj;
 int dim;
  .
  .
  .

    public:
 Bin();
  .
  .       // ostali moguci konstruktori, copy konstruktori, destruktori ...
  .
 
 bool operator>(const Bin & neki_broj_za_poredjenje)
  .
  .      // ostali preoptereceni operatori...
  .

 //itd
};

 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija22.12.2007. u 19:17 - pre 199 meseci
Evo ovako, ja sam pokusao realizovati klasu tako sto sam binarni broj predstavio kao niz karaktera.
Razmisljao sam o resenju preko stringa, ali ne znam raditi sa tom klasom;

Takodje mi je problem dinamicka alokacija memorije;

Preklapanje operatora znam, problem mi je bio preklapanje >> i kaskadno povezivanje.

Ne znam ni napraviti konstruktor (ovaj konkretan);

Ako bi mi mogao poslati citav kod programa pa da vidim kako se to realizuje u kompletu;

 
Odgovor na temu

icobh
Igor Pejašinović
Network Admin
Navigo SC d.o.o.
Banja Luka

Član broj: 18738
Poruke: 1319
*.inecco.net.

Sajt: www.nsc.ba


+4 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija22.12.2007. u 19:34 - pre 199 meseci
Ovo mi je poznato od nekud. Da nisi bio na kolokviju kod Brđe?
I ♥ ♀

Ovaj post je zlata vrijedan!
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija22.12.2007. u 19:38 - pre 199 meseci
Jesam, zeznuo me i na vjezbama pretprosle sedmice sa stringom,
isto sam uradio program VelikiBroj sa nizom!!!
Dao mi je samo bod, kao za trud...

Na pripremi smo radili matricu, od prosle godine.
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp180.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija22.12.2007. u 19:52 - pre 199 meseci
Eh, sad, lijepo pise na pocetku da ne treba traziti da netko rijesi zadatak umjesto tebe... Ako treba pomoci, nema problema, ali nemoj pretjerivati... Sto se tice datog konstruktora, trebao bi ici ovako nekako:

Code:


Bin::Bin(int int_broj, int max_cifara)
 {
    dim = max_cifara;
  
  for (int i=0; i<dim; i++)                                      // popuni string sa ciframa 0, po defaultu
    binarni_broj += "0";
  
  if ( int_broj > (pow(2,dim)-1))                            // provjera da li dati broj moze stati u binarni broj velicine dim
   //throw(error())                                              // 2^dim je max broj koji se moze spremiti, ako je dim 3 znaci
   cout << "ERROR\n";                                         // 2^3 je 8, tj. ne moze se spremiti broj veci od 8
  else
   {
    int index = dim - 1;                                        // index koji nam sluzi za pomicanje unazad po binarni_broj
    int rez = int_broj;                                          
    
    while(rez != 0)                                              // standardni algoritam pretvaranja int u binarni broj
     {  
      if ((rez % 2) == 1)
       binarni_broj[index--] = '1';
      else
       binarni_broj[index--] = '0';
      rez = rez / 2;
     }
    
    while (index != -1)                                         // popunjavanje ostatka binarni_broj sa nulama
     {
      binarni_broj[index--] = '0';
     }
   }
 }



Sto se tice same manipulacije stringovima, veoma je jednostavno. Puno je jednostavnije raditi sa stringovima nego sa nizovima znakova. Preporucam ti da za vjezbu pokusas sam napraviti string klasu.

Evo primjera:

Code:


#include <iostream>
using namespace std;

int main(void)
 {
  string S;
  
  cin >> S;
  
  cout << S << "\n";
  
  cout << "Slovo na poz 3: " << S[3] << "\n";
  
  S += "rijec";
  
  cout << S << "\n"; 
 
  system("pause");
  return EXIT_SUCCESS;             
 }

 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 09:52 - pre 199 meseci
Hvala, jos samo da mi pokazes dinamicku alokaciju.

Kako da sortiram niz B?
Gdje da smjestim niz prirodnih brojeva na osnovu kojeg cu formirati niz B, da li se taj niz formira dinamicki?
Ne vidim kako bi se drugacije i mogao napraviti, ne poznajem unaprijed broj clanova tog niza.
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp319.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 13:41 - pre 198 meseci
Dinamicka alokacija je relativno jednostavna za pocetak. Imas dvije funkcije (operatora) koje sluze za manipulaciju memorijom. To su new i delete (ili jos iz starog C-a nesto slicno: malloc() i free()). Kada se kaze “dinamicka” memorija obicno se misli na heap, tj. dio memorije koji se koristi za dinamicko zauzimanje i oslobadjanje, u nekom najprostijem konceptu naravno… Probaj google malo dublje, ili u knjizi nekoj…

Uglavnom, dinamicka alokacija ne radi bez pointera. New i delete rade samo sa pointerima. Kolicina memorije koja se zauzima zavisi od velicine tip varijable koju zelis zauzeti ( sizeof() ), broja clanova nekog niza ako se radi o nizu, velicini strukture/klase/datoteke …

Prosto:

Code:


int *a;

a = new int(4);

cout << *a << endl;



Kasnije, za brisanje sadrzaja pointera (ali ne i samog pointera !) koristi se delete:

Code:


delete a;



Ako neku dinamicki alociranu memoriju ne “izbrises”, stvara se nesto sto se zove curenje memorije. Morati ces malo sire o tome naci na netu, tema je dosta siroka…

Uglavnom, jos samo par stvari… Da bi zauzeo neki niz brojeva potrebno ti je:

Code:


int *a = new int[10];

// kasnije i delete [] a;
// da bi izbrisao niz!

// Nakon ovoga clanovima pristupas kao i normalnom nizu:

a[0] = 1;
a[1] = 99;

cout << a[1] << endl; //itd…



Kako ovo iskoristiti u zadatku, to je drugo pitanje... Vidjet cu ako danas budem imao vremena pa cu ti napisati par koncepta ...
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp118.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 14:55 - pre 198 meseci
E sto se tice zadatka samog... Uradio sam jos sinoc Bin klasu, vjezbe radi :) Prilozicu cijeli program u attachmentu sa klasom, evo ovdje samo Bin dio:

Code:


class Bin
{
 int dim;
 string binarni_broj;
 
    public:
 Bin();
 Bin(int max_cifara);             
 Bin(int max_cifara, int int_broj);
 Bin(const Bin&);
 ~Bin() {}
 
 string getBinarniBroj()           const { return binarni_broj; }
 void   setBinarniBroj(string set)       { binarni_broj = set; }
 void   setBinarniBroj(int set)          ;
 int    getDim()                   const { return dim; }
 
 bool operator > (const Bin &);
 Bin operator ~ ();
 const Bin& operator ++();
 operator int();

 friend int count(const Bin& toCount);
 friend ostream& operator << (ostream& theStream, Bin& binary);
 friend istream& operator >> (istream& theStream, Bin& binary);
};



IMPLEMENTACIJE :

Code:


//==================== konstruktori ==================//


Bin::Bin()
 {
  dim = 4;                        // default vrijednost za dim, proizvoljno
  
  for (int i=0; i<dim; i++)  
    binarni_broj += "0";         
 }



Bin::Bin(int int_u_binarni)
 {
  dim = 4;
  
  for (int i=0; i<dim; i++)
    binarni_broj += "0";
  
  this->setBinarniBroj( int_u_binarni );
 }



Bin::Bin(int max_cifara, int int_broj)
 {
    dim = max_cifara;
  
  for (int i=0; i<dim; i++)
    binarni_broj += "0";
  
  this->setBinarniBroj( int_broj );
 } 



Bin::Bin(const Bin &rhs)
 {
  dim = rhs.getDim();
  binarni_broj = rhs.getBinarniBroj();
 }



Code:


//=================== get() i set() ===================//


void Bin::setBinarniBroj(int set)
 {
  if ( set > (pow(2,dim)-1))
   //throw(error())
   cout << "ERROR\n";
  else
   {
    int index = dim - 1;
    int rez = set;
    
    while(rez != 0)
     {
      if ((rez % 2) == 1)
       binarni_broj[index--] = '1';
      else
       binarni_broj[index--] = '0';
      rez = rez / 2;
     }
    
    while (index != -1)
     {
      binarni_broj[index--] = '0';
     }
   }
 }



Code:


//==================   operatori    ===================//

bool Bin::operator > (const Bin &rhs)
 {
  string rhs_binarni_broj = rhs.getBinarniBroj();
  
  for (int i=0; i<dim; i++)
   {
    if ( (binarni_broj[i] == '1') && (rhs_binarni_broj[i] == '0') )
     return true;
    if ( (binarni_broj[i] == '0') && (rhs_binarni_broj[i] == '1') )
     return false;
   }
  return false;
 }



Bin Bin::operator ~ ()
 {
  Bin temp(*this);
  string komplement = temp.getBinarniBroj();
  
  for (int i=0; i<dim; i++)
   {
    if (komplement[i] == '1')
     komplement[i] = '0';
    else
     komplement[i] = '1';
   }
  
  temp.setBinarniBroj( komplement );
  return temp;
 }



const Bin& Bin::operator ++ ()
 {
  for (int i=dim-1; i >= 0; i--)
   {
    if (binarni_broj[i] == '1')
     binarni_broj[i] = '0';
    else
     {
      binarni_broj[i] = '1';
      return *this;
     }
   }
  return *this;
 }



Bin::operator int () 
 {
  int int_rez = 0;
  int eksponent = 0;
  
  for (int i=dim-1; i >= 0; i--)
   int_rez += ( (binarni_broj[i] - '0') * ( (int) pow(2, eksponent++) ));
  return int_rez;
 }



Code:


// ================== friend funkcije ! ======================//

int count(const Bin &toCount)
 {
  int num = 0;
  string temp = toCount.getBinarniBroj();
  
  for (int i=0; i < toCount.getDim(); i++)
   if ( temp[i] == '1') 
    ++num;
   
  return num;
 }


ostream& operator << (ostream& theStream, Bin& binary)
 {
  theStream << binary.getBinarniBroj();
  return theStream;
 }


istream& operator >> (istream& theStream, Bin& binary)
 {
  string temp;
  theStream >> temp;
  binary.setBinarniBroj( temp );
  return theStream;
 }

Prikačeni fajlovi
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp118.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 15:00 - pre 198 meseci
Omogucene su sve funkcije trazene u programu, ukljucujuci kaskadnog povezivanja cin i cout, castovanja itd... Nisam implementirao main() dio, ali misim da je jako jednostavan sa ovom klasom da se uradi. Posto sebe smatram pocetnikom, a posto je ovo prvi put da sam implementirao neke koncepte (friend, operatori << i >>), molio bih da date komentare na apsolutno sve dijelove koda, sta bi poboljsali, promijenili, izbrisali, dodali ...

Veliki nedostaci koje sam ja primjetio :

- prema postavci zadatka, svaka Bin instanca ima svoj dim, koji je nepromjenjiv u programu... Bas zbog ovoga nisam se trudio implementirati dijelove kao rukovanje sa 2 Bin objekta razlicitih dim vrijednosti. Ako imamo 0101 i 101010, i stavimo 0101 > 101010 ? nece se dobiti odgovarajuci rezultat. Zbog podrazumijevanog dim da je svagdje isti, nema potrebe za ovim.
- u programu nema nikakve exception obrade, to razumijem, znam istu implementirati, nisam to uradio da ne komplikujem
- ostalih stvari se iskreno ne mogu sjetiti, ali primjetio sam jos toga...

Sad me zanima vase misljenje, oko SVEGA. Da li sam jos negdje trebao staviti const, smaknuti mozda? Svi prijedlozi/sugestije/kritike, slobodno ih iznesite!

Pozdrav!
 
Odgovor na temu

fresh.bm

Član broj: 162156
Poruke: 182
*.teol.net.



+1 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 15:30 - pre 198 meseci
Puno ti hvala na ovome,

sto se tice dim promjenjive u pravu si da ne treba implementirati obrade objekata sa razlicitim dim-ovima;

Ako opet sta zapne, javit cu se.
Pozdrav
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp354.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 17:12 - pre 198 meseci
Samo jos nesto, pitao si sta sa sortiranjem niza B... E ovako, sto se tice samog sortiranja, tu imas velik izbor... Sortiranje je jako olaksano implementaciom operatora >. Moguci pristupi (naravno kada bi radio neki slozeniji projekat) zavise striktno od resursa koji koriste i njihove brzine. Razliciti algoritmi su ti na raspolaganju:

- bubblesort brzina O(n^2) , najsporiji, najgori ali i najjednostavniji algoritam sortiranja...
- ostali O(N^2) algoritmi sortiranja, ali ipak malo brzi zavisno od slucaja do slucaja: insertion sort, selection sort ...
- neki mozda od najbrzih, quicksort, shellsort itd...

Ako te ova tema oko sortiranja malo vise zanima, pogledaj forum "art of programming".
Najjednostavnija je implementacija bubblesort-a, samo malo izmjeni kod da radi sa binarnim brojevima, sve metode su ti date u Bin klasi, kao argumenat proslijedi niz Bin brojeva...

Code:


// nije testirano!

bubblesort()                   
 {
    bool found = true;
    int temp;
    while(found)
     {
      found = false;
      int iter = nElem-1;
       for (int i=0; i<iter; i++)
        {
         if (a[i] > a[i+1])
          {
           // switch!
           temp = a[i];
           a[i] = a[i+1];
           a[i+1] = temp;
           found = true;
          } 
        }
       iter--; 
     } 
 }

 
Odgovor na temu

k.bojan

Član broj: 158850
Poruke: 28
*.broadband.blic.net.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 19:39 - pre 198 meseci
Citat:

class Bin
{
int dim;
string binarni_broj;

public:...


sto se tice zadatka od Sephiroth?-a ja imam jednu primjedbu...u zadatku pise da postoji jedan zajednicki atribut "dim"
kao sto se vidi u primjeru izvrsavanja programa dim se unosi na samom pocetku, sto znaci da treba da bude staticka promjenljiva.jednom se unosi i stalna je do kraja izvrsavanja programa,sem ako se ne navede drugacije(znaci trebalo bi ici "static int dim").

A sto se tice poredjenja nije problem jer je dim kod svih objekata isti,a i da je razlicit to se lako rijesi konverzijom izmedju tipova.Npr
operator int()const;
kada ovo preklopis on vrsi konverziju iz bin u int , a konstruktor vrsi konverziju iz int u bin, tako da ako imas dva objekta sa razlicitim dim-ovima(sto nije slucaj u zadatku) onda npr ako imas 10011100011 i 10110 odradis kastovanje oba objekta u int i samo poredis dva int-a zar ne ;)?

ja licno ne bih smjestao niz 0 i 1 u string vec preko pokazivaca...
evo dole interfejs klase kako bi ja uradio...
Jos nisam preklopio operator dodele i konstruktor kopije, a svi znamo gdje ima pointera ima i konstruktor kopije, operator dodjele i destruktor ;)
Pozdrav

P.S. Ako sam negdje pogrjesio bicu zahvalan ako mi neko ukaze na gresku




Code:

class Bin
{
    friend ostream &operator << (ostream &,const Bin);
    friend istream &operator >> (istream &, Bin &);
    friend int cifra(const Bin);
private:
    int *binArray;
    static int dim;
public:
    Bin();
    Bin(int);
    ~Bin();
    operator int()const;
    bool operator > (const Bin &) const;
    Bin operator~()const;
    Bin operator++();
    static void SetDim(int);
};



[Ovu poruku je menjao k.bojan dana 23.12.2007. u 21:01 GMT+1]
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp375.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 20:35 - pre 198 meseci
Da, slazem se sa static int dim... Ali kao sto sam i rekao, velik problem je u postavci zadatka...

Ovako:

a) sto se tice dim vrijednosti, mislim da bi najbolje rjesenje bilo da svaki Bin ima svoj dim, ali, da svaki binarni_broj odredjuje dim. Znaci ako je Bin a = 3, (binarno 11) dovoljan je dim = 2 da se spremi broj. Pri inkrementaciji, i svim ostalim opcijama trebalo bi da se manipulise sa ovim dim atributom klase tako da odgovara broju spremljenom u klasu. Drugi pristup bi bio da je dim jedinstven, npr 32, kao u arhitekturi 32-bit sistema... Slazem se da u zadatku dim treba biti static
btw, kada bi svaki dim jedinstveno odgovarao svakom binarnom broju, kod uporedbe bi bilo jednostavno provjeriti samo ciji je dim veci, jer je i taj broj veci... Ako su dim vrijednosti jednake, onda se moze primjeniti algoritam napravljen vec iznad.


b) sto se tice stringova ili pokazivaca... Ne bih znao sa sigurnoscu reci. Koliko znam stringovi u pozadini rukuju sa dinamicki alociranim nizovima znakova. Koristenjem string klase se otklanja dosta posla oko problema curenje memorije, jednostavnosti implementacije itd... Cinjenica je da pristup i sa pokazivacima ne bi bio narocito tezak za implementirati, ali koliki je dobitak time ako string-ovi znacajno pojednostavljuju stvar?

Uostalom da li je isplativije spremiti 20 Bin objekata koji se sastoje od ( int binarni_broj[5] ) ili 20 Bin objekata sa ( char binarni_broj[5] ). Sizeof(int) je 4 byte, dok je za char 1 byte, a stringovi rade na char nizovima.


Zasada samo par stvari oko tvoje deklaracije klase:

1) Upravu si da
Code:

friend ostream &operator << (ostream &,const Bin);

prima const Bin, ali zasto praviti dodatnu kopiju umjesto prosljedjivanja reference

Code:

friend ostream& operator << (ostream& theStream,const Bin& binary);


2) Zar
Code:
Bin operator++();

ne bi trebao vracati referencu na samog sebe, jer se on sam inkrementira?
Code:
const Bin& operator ++();


Pozdrav !
 
Odgovor na temu

k.bojan

Član broj: 158850
Poruke: 28
*.broadband.blic.net.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 21:02 - pre 198 meseci
Citat:
ne bi trebao vracati referencu na samog sebe, jer se on sam inkrementira?

Slazem se...moja greska...trebao bi vracati referencu na samog sebe...osim ako bi bilo nesto kao
Code:

const Bin operator ++()
{
      Bin tmp;
      ...
      return tmp;
}
[/quote]
ali slazem se da je bolje 
Code:
const Bin& operator ++();

jer onda nema podrebe za dodatnim objektom a samim tim i usteda memorije i povecanje brzine programa...

sto se tice
Code:
friend ostream &operator << (ostream &,const Bin);

potpuno se slazem da nema potreba za pravljenjem kopije objekta i u pravu si da je mnogo efikasnije
Code:
friend ostream& operator << (ostream& theStream,const Bin& binary);


Citat:
Uostalom da li je isplativije spremiti 20 Bin objekata koji se sastoje od ( int binarni_broj[5] ) ili 20 Bin objekata sa ( char binarni_broj[5] ). Sizeof(int) je 4 byte, dok je za char 1 byte, a stringovi rade na char nizovima.


iskreno ovo mi nije palo na pamet :(
ovo je mnogoooooo bolje nego prego int *
iz razloga koji si naveo...manje zauzimanje memorije :)))

slazem se da bi najbolje bilo da svaki Bin ima svoj dim ako nista drugo zbog poredjenja i manje memorije...ali zadatak zahtjeva staticki dim(sto je nepotrebno)
kada za svaki ucitani string uradis strlen(ime_stringa) i dobijes dim :)))

Pozdrav
Hvala na korekcijama ;)
u svemu se potpuno slazem
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp140.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 21:21 - pre 198 meseci
Jedino moram malo prouciti ovo sa friend, to mi je potpuno novo, znas ono kada nesto zaobilazis za ucenje a ne znas ni sam zasto... ;) Razumijem potpuno za sta se koristi (u principu), ali ne razumijem zasto ovi operatori moraju biti friend. Program savrseno lijepo radi i bez postavljanja da su ove funkcije friend (komentiraj njihove prototipe u deklaraciji klase). Moram malo procitati oko toga i pronaci par primjera, nadam se da ce mi onda stvari biti jasnije... Pozdrav!
 
Odgovor na temu

k.bojan

Član broj: 158850
Poruke: 28
*.broadband.blic.net.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 21:44 - pre 198 meseci
U C++ ne postoje naredbe niti operatori za ulaz i izlaz podataka, već se ulaz i izlaz realizuju
odgovarajućim klasama.


Svakoj otvorenoj datoteci, kao i standardnom ulazu/izlazu pridružuje se po primjerak jedne od
tih klasa. Pristup nekoj datoteci ostvaruje se pristupanjem tim objektima putem njihovih
funkcija članica ili prijateljskih funkcija.


Sve potrebne deklaracije vezane za klase za ulaz i izlaz podataka nalaze se u <iostream.h>
Klasa za ulaz podataka naziva se istream. Klasa za izlaz podataka naziva se ostream.
Objekat klase istream za pristup standardnom ulazu (tastaturi) zove se cin.
Objekat klase ostream za pristup standardnom izlazu (monitor) zove se cout.


Ova dva objekta (cin, cout) automatski se stvaraju na početku izvršavanja svakog programa.
Operatori za čitanje i pisanje podataka (uz primjenu ulazno-izlaznih konverzija) definisani su za
sve standardne tipove podataka preklapanjem operatora >> i <<.


Prototipovi odgovarajućih operatorskih funkcija su:
istream & operator>> (istream &dat, Tip &data);
data je odredište za podatke i ne moze biti const
(za sada cin)
ostream & operator<< (ostream &dat, const Tip &data);
data je izvor podataka
(za sada cout)


Obje funkcije vraćaju upućivač na datoteku dat (za sada cin i cout). Ovi upućivači su ujedno i
prvi operandi operatorskih funkcija. Ovo omogućava kaskadno (lančano) pozivanje operatora
>> i <<, odnosno prenošenje više podataka jednim izrazom. Ovo je moguće jer je njihova
asocijativnost slijeva udesno.


Programer može preklapanjem operatora >> i << da obezbijedi operatore za U/I konverzije
svojih klasa. Ove funkcije moraju da budu prijateljske funkcije korisničkim klasama. Ne mogu
da budu funkcije članice, jer prvi objekat nije korisnički definisan!

Evo jedan jednostavni primjer

Code:

#include <iostream.h>
class Complex
{
friend ostream & operator<< (ostream &dat, const Complex &z)
{ return dat << "(" << z.real << "," << z.imag << ")" ; }
public:
Complex (double re=0, double im=0) : real(re), imag(im) {}
private:
double real, imag;
};
main()
{
Complex z(1,1);
cout << "z = " << z << endl;
}


Nadam se da sam bar malo pomogao
Pozdrav
 
Odgovor na temu

Sephiroth?
Balkan @ net

Član broj: 79406
Poruke: 82
*.bi2.dlp454.bih.net.ba.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 22:02 - pre 198 meseci
Mehanizam rukovanja sa I/O operacijama razumijem...

Citat:
k.bojan: ... Ove funkcije moraju da budu prijateljske funkcije korisničkim klasama. Ne mogu
da budu funkcije članice, jer prvi objekat nije korisnički definisan! ...


Ovo me jedino buni... Kako mislis? Ne kontam te... Kakva je primjena friend za funkciju count() u gornjem zadatku onda?

 
Odgovor na temu

k.bojan

Član broj: 158850
Poruke: 28
*.broadband.blic.net.



Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 22:24 - pre 198 meseci
Citat:
Sephiroth?...Kakva je primjena friend za funkciju count() u gornjem zadatku onda?

Nikakva...ova funkcija je mogla da bude implementirana i kao funkcija clanica...ali u zadatku pise da ta funcija treba da bude implementirana kao prijateljska,pa sam je zato tako i implementirao.

Citat:
Ove funkcije moraju da budu prijateljske funkcije korisničkim klasama. Ne mogu
da budu funkcije članice, jer prvi objekat nije korisnički definisan! ...


Ovo me jedino buni... Kako mislis? Ne kontam te...


E pazi objekat ostream je objekat neke klase koju nije korisnik definisao vec je definisana u C++ library.
Pretpostavimo da u toj biblioteci imamo apstraktnu klasu IO koja definise ulazni izlazne tokove...e sada nju nasledjuju dve klase Input i Output.
E sada iostream je objekat klase Input koja je nasljedila IO i samim tim vec definisana u library...
Znas i sam da je IO realizovan preko klase u C++u kao i sve druge operacije...kao sto je operator + preklopljen za koprisnicki definisane tipove kao sto su int,char,float,double
Znaci ti ne mozes da pises nesto kao:
Code:

istream &operator(Tip &data){...}

jer
kada napises npr
Code:

bool operator==( const Bin &a ) const;

ovdje se podrazumjeva da je objekat s kojim ces vrsiti poredjenje(poredjenje tvog objekta i Bin-u ovom slucaju su oba Bin) da li je jednak,je objekat tvoje klase,tj korisnicki definisane
tj.
prvom objektu ces pristupati kao
binArray[index] direktno
a drugom
a.binArray[index] indirektno
i onda ces da ih poredis
a ti kod preklapanje operatora << treba da uzmes podatak Bin i da ga ispises na cout(koji nije korisnicki definisan), tj ti ne mozes private podacima clanovima da pristupas direktno,vec samo indirektno kao sto sam ti naveo u predhodnom primjeru(a to je definisano standardom).

Nadam se da si uspio da skontas...ako nisi reci sta ti nije jasno pa cu pokusati da ti objasnim (onoliko koliko mogu jer i sam sam nov u ovome :))

P.S.
Moguce je da sam negdje i pogresio
U svakom slucaju provjeri...a i ja cu...ako nesto saznam ostavicu post ovdje
Pozdrav

[Ovu poruku je menjao k.bojan dana 23.12.2007. u 23:51 GMT+1]
 
Odgovor na temu

icobh
Igor Pejašinović
Network Admin
Navigo SC d.o.o.
Banja Luka

Član broj: 18738
Poruke: 1319
*.inecco.net.

Sajt: www.nsc.ba


+4 Profil

icon Re: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija23.12.2007. u 22:53 - pre 198 meseci
Prijateljske f-je se koriste onda kada je poželjno da se zaobiđu neki prioriteti odnosno da se nešto stavi u isti položaj.

Npr. operator "+" se može preklopiti kao f-ja članica klase ali se onaj drugi operand stavlja, da tako kažem, u potlačen položaj:
Code:
A.operator+(B);


Onda se pribjegava impelementaciji sa prijateljskom funkcijom gdje su operandi u istom položaju:
Code:
operator+(A,B);

I ♥ ♀

Ovaj post je zlata vrijedan!
 
Odgovor na temu

[es] :: C/C++ programiranje :: C/C++ za početnike :: pomoc oko rešenja zadatka, uvod u cpp klase, preklapanje operatora i dinamička alokocija

Strane: 1 2

[ Pregleda: 4660 | Odgovora: 33 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.