Search
 
 
  Engleski
 
 
 
Open in this window (click to change)
Forum@DeGiorgi: Početna
Forum za podršku nastavi na PMF-MO
Login Registracija FAQ Smajlići Članstvo Pretražnik Forum@DeGiorgi: Početna

zadaci (objasnjenje gradiva)
WWW:
Idite na 1, 2  Sljedeće
Moja sarma
 
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++)
Prethodna tema :: Sljedeća tema  
Autor/ica Poruka
charlotte
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 04. 2006. (14:30:51)
Postovi: (1E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 13:50 sub, 20. 3. 2010    Naslov: zadaci Citirajte i odgovorite

Pozdrav, rjesavala sam neke zad, ali ne rade kako treba. Pa da li bi mi netko mogao pomoci da ih ispravim?


/* Napisite program koji cita stringove sa standardnog ulaza ubacujuci pritom jedan po jedan vektor,
te nakon unosa EOF(^Z) ispisuje sadrzaj dobivenih vektora.*/

#include <iostream>
#include <vector>
#include<string>
using namespace std;



int main(){

vector<string> text;
string word;
int br=0;

for(br=0;br<100000;br++){

while(cin>>word){
text.push_back(word);

if(text[br] == "EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<'';
cout<<endl;
break;
}
}
}
system("pause");
return 0;
}

Javlja mi ovu gresku:error C2137: empty character constant



/*Napisi fju koja broji koliko se puta u nekoj rijeci pojavljuje par slova ab.
Npr. ab se pojavljuje 2x u rijeci "xabaacbaxabb" */

#include<iostream>
#include<string>
using namespace::std;

int f(string p){
int br1=0,gdje;
string q,m;

q=p;

if(q.size()==0) return br1=0;

gdje=q.find("ab",0);

if(gdje==string::npos) return br1=0;

while(gdje){
br1++;
m=q.substr(gdje,q.size()-gdje);
gdje=m.find("ab",0);
q=m;
if(gdje > q.size()) break;
}

return br1;
}

int main(){

string s1;
int B;

cin>>s1;

B=f(s1);

cout<<B<<endl;

system("pause");
return 0;

}

Uvijek mi ispisuje broj 1.


/* Napisite program koji ucitava i stavlja na kraj liste stringove sve dok se ne ucita
string "kraj". Ispisite sadrzaj dobivene liste pomocu pomocu pop_front() i front()
operacija, te pomocu iteratora.*/

#include<iostream>
#include<string>
#include<list>
using namespace::std;

int main(){

list<string> nova;
list<string>::iterator iter;
string s;

while(cin>>s){
while(s!="kraj")
nova.push_front(s);
}
for(iter=nova.begin();iter<nova.end();iter++)
cout<<*iter<<endl;

}
system("pause");
return 0;
}

Unaprijed hvala![/table]
Pozdrav, rjesavala sam neke zad, ali ne rade kako treba. Pa da li bi mi netko mogao pomoci da ih ispravim?


/* Napisite program koji cita stringove sa standardnog ulaza ubacujuci pritom jedan po jedan vektor,
te nakon unosa EOF(^Z) ispisuje sadrzaj dobivenih vektora.*/

#include <iostream>
#include <vector>
#include<string>
using namespace std;



int main(){

vector<string> text;
string word;
int br=0;

for(br=0;br<100000;br++){

while(cin>>word){
text.push_back(word);

if(text[br] == "EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<'';
cout<<endl;
break;
}
}
}
system("pause");
return 0;
}

Javlja mi ovu gresku:error C2137: empty character constant



/*Napisi fju koja broji koliko se puta u nekoj rijeci pojavljuje par slova ab.
Npr. ab se pojavljuje 2x u rijeci "xabaacbaxabb" */

#include<iostream>
#include<string>
using namespace::std;

int f(string p){
int br1=0,gdje;
string q,m;

q=p;

if(q.size()==0) return br1=0;

gdje=q.find("ab",0);

if(gdje==string::npos) return br1=0;

while(gdje){
br1++;
m=q.substr(gdje,q.size()-gdje);
gdje=m.find("ab",0);
q=m;
if(gdje > q.size()) break;
}

return br1;
}

int main(){

string s1;
int B;

cin>>s1;

B=f(s1);

cout<<B<<endl;

system("pause");
return 0;

}

Uvijek mi ispisuje broj 1.


/* Napisite program koji ucitava i stavlja na kraj liste stringove sve dok se ne ucita
string "kraj". Ispisite sadrzaj dobivene liste pomocu pomocu pop_front() i front()
operacija, te pomocu iteratora.*/

#include<iostream>
#include<string>
#include<list>
using namespace::std;

int main(){

list<string> nova;
list<string>::iterator iter;
string s;

while(cin>>s){
while(s!="kraj")
nova.push_front(s);
}
for(iter=nova.begin();iter<nova.end();iter++)
cout<<*iter<<endl;

}
system("pause");
return 0;
}

Unaprijed hvala![/table]


[Vrh]
Korisnički profil Pošaljite privatnu poruku
matmih
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 12. 2006. (22:57:42)
Postovi: (1A4)16
Spol: muško
Sarma = la pohva - posuda
36 = 51 - 15
Lokacija: {Zg, De , Ri}

PostPostano: 14:36 sub, 20. 3. 2010    Naslov: Citirajte i odgovorite

Evo za prvi zadatak koji sam sad pogledao:

Grešku ti javlja zbog ovog:

[code:1]cout<<text[i]<<''; [/code:1]

Tebi treba ovo:

[code:1] cout<<text[i]<<" "; [/code:1]
ako si mislila razmak stavit između svaka dva stringa. ' ' Označava znak, a
" " oznacava string. :)

Nadalje, i uz tu modifikaciju program ti neče radit, zašto:

1. U while petlji ti se nigdje ne mijenja br, dakle do got ti učitavaš riječi while petlja će se izvršavat i br će ti bit 0, što znači da ti je ona provjera u if uzaludna u tom slučaju (osim ako odmah naa početku ne upišeš EOF(^Z). To rješiš tako da povečaš br nakon if-a, a kad to napraviš, for ti više neće trebati...

2. Nisam siguran dali sam dobro skužio zadatak, dali ti trebaš ubacivat riječi u vektor ili moraš imati niz vektora, zadatak ti je malo čudno napisan?
Po tvom kodu ja sam zaključio da trebaš ubacivati rječi u vektor dok ne upišeš EOF(^Z). :)
Evo za prvi zadatak koji sam sad pogledao:

Grešku ti javlja zbog ovog:

Kod:
cout<<text[i]<<'';


Tebi treba ovo:

Kod:
 cout<<text[i]<<" ";

ako si mislila razmak stavit između svaka dva stringa. ' ' Označava znak, a
" " oznacava string. Smile

Nadalje, i uz tu modifikaciju program ti neče radit, zašto:

1. U while petlji ti se nigdje ne mijenja br, dakle do got ti učitavaš riječi while petlja će se izvršavat i br će ti bit 0, što znači da ti je ona provjera u if uzaludna u tom slučaju (osim ako odmah naa početku ne upišeš EOF(^Z). To rješiš tako da povečaš br nakon if-a, a kad to napraviš, for ti više neće trebati...

2. Nisam siguran dali sam dobro skužio zadatak, dali ti trebaš ubacivat riječi u vektor ili moraš imati niz vektora, zadatak ti je malo čudno napisan?
Po tvom kodu ja sam zaključio da trebaš ubacivati rječi u vektor dok ne upišeš EOF(^Z). Smile


[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
charlotte
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 04. 2006. (14:30:51)
Postovi: (1E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 15:42 sub, 20. 3. 2010    Naslov: Citirajte i odgovorite

Da, jedan je vektor :lol: . Mislis ovako?

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;


while((cin>>word) &(word!="EOF(^Z)"))
text.push_back(word);

if(text.end()=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
}



system("pause");
return 0;
}

Meni ni to ne radi :( .
Da, jedan je vektor Laughing . Mislis ovako?

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;


while((cin>>word) &(word!="EOF(^Z)"))
text.push_back(word);

if(text.end()=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
}



system("pause");
return 0;
}

Meni ni to ne radi Sad .


[Vrh]
Korisnički profil Pošaljite privatnu poruku
matmih
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 12. 2006. (22:57:42)
Postovi: (1A4)16
Spol: muško
Sarma = la pohva - posuda
36 = 51 - 15
Lokacija: {Zg, De , Ri}

PostPostano: 16:39 sub, 20. 3. 2010    Naslov: Citirajte i odgovorite

[code:1] #include <iostream>
#include <vector>
#include<string>

using namespace::std;


int main(){

vector<string> text;
string word;


while( (cin>>word) && (word!="EOF(^Z)") )
text.push_back(word);



cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;



scanf("%%");

return 0;
}
[/code:1]

E sad:
Jesi ti uopće compilirala ovo šta si postala? :)

Logičko and je &&, a ne & (ovo drugo je and po bitovima...)

text.end(), vrača iterator na kraj vektora, pa ti uspoređuješ iterator i string (tu bi ti se trebao i compiler bunit).

Ali da se i ne buni ovaj if je besmislen zato što stavljaš riječ u vektor samo ako ta riječ nije jednaka "EOF( ^Z)". ;)
Tako da u tvome primjeru se neće vrlo vjerojatno ništa ispisat. :)
Kod:
 #include <iostream>
#include <vector>
#include<string>

using namespace::std;


int main(){

  vector<string> text;
   string word;


       while( (cin>>word) && (word!="EOF(^Z)") )
                         text.push_back(word);



    cout<<"Procitane rijeci:"<<endl;

    for(unsigned int i=0; i!=text.size(); ++i)
                 cout<<text[i]<<" ";
                 cout<<endl;



scanf("%%");

return 0;
}


E sad:
Jesi ti uopće compilirala ovo šta si postala? Smile

Logičko and je &&, a ne & (ovo drugo je and po bitovima...)

text.end(), vrača iterator na kraj vektora, pa ti uspoređuješ iterator i string (tu bi ti se trebao i compiler bunit).

Ali da se i ne buni ovaj if je besmislen zato što stavljaš riječ u vektor samo ako ta riječ nije jednaka "EOF( ^Z)". Wink
Tako da u tvome primjeru se neće vrlo vjerojatno ništa ispisat. Smile


[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
charlotte
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 04. 2006. (14:30:51)
Postovi: (1E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 17:47 sub, 20. 3. 2010    Naslov: Citirajte i odgovorite

Pa jesam... Zakaj ovo ne radi?

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;
vector<string>::iterator it;

while(cin>>word){
text.push_back(word);
it=text.end();
if(*it=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
break;
}
}


system("pause");
return 0;
}
Pa jesam... Zakaj ovo ne radi?

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;
vector<string>::iterator it;

while(cin>>word){
text.push_back(word);
it=text.end();
if(*it=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
break;
}
}


system("pause");
return 0;
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
m00nblade
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 30. 10. 2005. (13:26:10)
Postovi: (54)16
Spol: muško
Sarma = la pohva - posuda
20 = 20 - 0

PostPostano: 18:15 sub, 20. 3. 2010    Naslov: Citirajte i odgovorite

Problem ti je u ovome:
[code:1]
it=text.end();
if(*it=="EOF(^Z)"){
[/code:1]

vector::end() ne vraca iterator na zadnji element u vektoru, nego iterator koji označava kraj vektora i koji se ne smije dereferencirati.

Bilo bi ti bolje da umjesto
[code:1]if (*it == "EOF(^Z)") {[/code:1]
staviš
[code:1]if (word == "EOF(^Z)") {[/code:1]

I jos nesto, EOF(^Z) označava end-of-file znak, koji se na Unixu dobije s Ctrl+D, a na Windowsima s Ctrl+Z :)

Tako da u kodu možeš staviti:
[code:1]
while (cin >> word) {
text.push_back(word);
}

cout << "Procitane rijeci: " << endl;
for (int i = 0; i < text.size(); ++i) {
cout << text[i] << " ";
}
[/code:1]

I onda kad želiš završiti unos riječi, stisneš Ctrl+Z :)
Problem ti je u ovome:
Kod:

it=text.end();
if(*it=="EOF(^Z)"){


vector::end() ne vraca iterator na zadnji element u vektoru, nego iterator koji označava kraj vektora i koji se ne smije dereferencirati.

Bilo bi ti bolje da umjesto
Kod:
if (*it == "EOF(^Z)") {

staviš
Kod:
if (word == "EOF(^Z)") {


I jos nesto, EOF(^Z) označava end-of-file znak, koji se na Unixu dobije s Ctrl+D, a na Windowsima s Ctrl+Z Smile

Tako da u kodu možeš staviti:
Kod:

while (cin >> word) {
    text.push_back(word);
}

cout << "Procitane rijeci: " << endl;
for (int i = 0; i < text.size(); ++i) {
    cout << text[i] << " ";
}


I onda kad želiš završiti unos riječi, stisneš Ctrl+Z Smile



_________________
Real programmers don't comment their code. If it was hard to write, it should be hard to read.
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
charlotte
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 04. 2006. (14:30:51)
Postovi: (1E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 13:47 ned, 21. 3. 2010    Naslov: Citirajte i odgovorite

Program mi radi i ako dodam it--. Na slican nacin sam ispravila i onaj sa listama :) .

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;
vector<string>::iterator it;

while(cin>>word){
text.push_back(word);
it=text.end();
it--;
if(*it=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
break;
}
}


system("pause");
return 0;
}

Moze jos mala pomoc oko onog sa stringovima :lol: ? I kako napisati fju koja kao argument prima pokazivac na listi stringova ili listu stringova?
Ovako nesto nejde: void f(listi<string> L) ili void f(list<string>* p)
Program mi radi i ako dodam it–. Na slican nacin sam ispravila i onaj sa listama Smile .

#include <iostream>
#include <vector>
#include<string>
using namespace::std;



int main(){

vector<string> text;
string word;
vector<string>::iterator it;

while(cin>>word){
text.push_back(word);
it=text.end();
it–;
if(*it=="EOF(^Z)"){

cout<<"Procitane rijeci:"<<endl;

for(unsigned int i=0; i!=text.size(); ++i)
cout<<text[i]<<" ";
cout<<endl;
break;
}
}


system("pause");
return 0;
}

Moze jos mala pomoc oko onog sa stringovima Laughing ? I kako napisati fju koja kao argument prima pokazivac na listi stringova ili listu stringova?
Ovako nesto nejde: void f(listi<string> L) ili void f(list<string>* p)


[Vrh]
Korisnički profil Pošaljite privatnu poruku
ivo34
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 03. 02. 2005. (10:11:04)
Postovi: (171)16
Spol: muško
Sarma = la pohva - posuda
35 = 43 - 8

PostPostano: 18:36 ned, 21. 3. 2010    Naslov: Citirajte i odgovorite

[quote="charlotte"]Moze jos mala pomoc oko onog sa stringovima :lol: ? [/quote]
Malo sam prepravio tvoju funkciju, ovo bi ti trebalo dobro raditi:
[code:1]int f(string p){
int br1=0,gdje,duljina;
string q;
q=p;
duljina=q.size();
while (duljina) {
gdje = q.find("ab",0);
if(gdje==string::npos)
break;
else {
++br1;
q = q.substr(gdje+2,duljina-2);
duljina = q.size();
if (gdje== duljina)
break;
}
}
return br1;
}[/code:1]
Mislim da ok radi, testiraj malo i pitaj ako nije nesto jasno... :)
charlotte (napisa):
Moze jos mala pomoc oko onog sa stringovima Laughing ?

Malo sam prepravio tvoju funkciju, ovo bi ti trebalo dobro raditi:
Kod:
int f(string p){
   int br1=0,gdje,duljina;
   string q;
   q=p;
   duljina=q.size();
   while (duljina) {
      gdje = q.find("ab",0);
      if(gdje==string::npos)
         break;
      else {
         ++br1;
         q = q.substr(gdje+2,duljina-2);
         duljina = q.size();
         if (gdje== duljina)
            break;
      }
   }
   return br1;
}

Mislim da ok radi, testiraj malo i pitaj ako nije nesto jasno... Smile
[Vrh]
Korisnički profil Pošaljite privatnu poruku
Cobs
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 21. 01. 2008. (13:32:15)
Postovi: (206)16
Spol: muško
Sarma = la pohva - posuda
26 = 40 - 14
Lokacija: Geto

PostPostano: 23:03 ned, 21. 3. 2010    Naslov: Citirajte i odgovorite

[quote="charlotte"]
Ovako nesto nejde: void f(listi<string> L) ili void f(list<string>* p)[/quote]

nisam isprobavo, al ak nis ne sljaka od ove "obicne" sintakse, probo bi napravit klasu koja sadrzi listu stringova, a zatim ubacit pokazivac na tu klasu kao argument funkcije, pa si dobila skoro istu stvar koju si željela ( inace sam rjesil par tih prvih zadataka pa ak oces posaljem ti na pm )
charlotte (napisa):

Ovako nesto nejde: void f(listi<string> L) ili void f(list<string>* p)


nisam isprobavo, al ak nis ne sljaka od ove "obicne" sintakse, probo bi napravit klasu koja sadrzi listu stringova, a zatim ubacit pokazivac na tu klasu kao argument funkcije, pa si dobila skoro istu stvar koju si željela ( inace sam rjesil par tih prvih zadataka pa ak oces posaljem ti na pm )


[Vrh]
Korisnički profil Pošaljite privatnu poruku Posjetite Web stranice
charlotte
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 25. 04. 2006. (14:30:51)
Postovi: (1E)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 13:17 pon, 22. 3. 2010    Naslov: Citirajte i odgovorite

Moze :D to bi bilo super!
Moze Very Happy to bi bilo super!


[Vrh]
Korisnički profil Pošaljite privatnu poruku
bleki88
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 24. 09. 2009. (17:13:58)
Postovi: (27)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 16:40 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

U ovom zadatku s vjezbi koristili smo pomocnu klasu Broj_zbrajanje,
el mi moze ko objasnit cemu ona sluzi mislim zakaj smo bas to tak radili.
Evo rjesenja zadatka:

[code:1]#include <iostream>
#include <string>

using namespace std;

[color=red]struct broj_zbrajanje;[/color]

struct broj {

int* znamenke;
int duljina;
broj(){}
broj( const string );
broj( const broj& );
broj( [color=red]const broj_zbrajanje& x[/color] ){ *this = x; }
broj& operator=( [color=red]const broj_zbrajanje&[/color] );
~broj();
friend [color=red]broj_zbrajanje[/color] operator+( const broj&, const broj& );


};

[color=red] struct broj_zbrajanje{

const broj& a;
const broj& b;
broj_zbrajanje( const broj& a, const broj& b ): a( a ), b( b ) {}

};[/color]

broj::broj( const string s ){

duljina = s.size();
znamenke = new int[ duljina ];

for( int i = 0; i < duljina; i++ )
znamenke[i] = s[i] - '0';

}

broj::broj( const broj& x ){

znamenke = new int[ x.duljina ];
duljina = x.duljina;
for( int i = 0; i < duljina; i++ )
znamenke[i] = x.znamenke[i];

}

broj& broj::operator=([color=red] const broj_zbrajanje& x[/color] ){

if( znamenke ) delete [] znamenke;
int max = x.a.duljina;
int a = x.a.duljina - 1,b = x.b.duljina - 1, c = 0;
if( x.b.duljina > max ) max = x.b.duljina;
znamenke = new int[ max + 1 ];
duljina = max + 1;
for( int i = max; i >= 0; i-- ){
int suma_a = (a >= 0) ? x.a.znamenke[a] : 0;
int suma_b = (b >= 0) ? x.b.znamenke[b] : 0;
a--;b--;
znamenke[i]=(suma_a+suma_b+c)%10;
c = (suma_a+suma_b+c)/10;

}



}

broj_zbrajanje operator+( const broj& x, const broj& y ){
return [color=red]broj_zbrajanje( x, y )[/color];

}

void ispis( const broj& x ){

if( x.znamenke[0] != 0 )
cout << x.znamenke[0];
for( int i = 1; i < x.duljina; i++ )

cout << x.znamenke[i];
cout << endl;


}

broj::~broj(){ if( znamenke ) delete [] znamenke; }



int main(){

broj a("99999999999999999999999999999");
broj b("1");

broj c = a + b;

ispis( c );


system("pause");
return 0;

}
[/code:1]
U ovom zadatku s vjezbi koristili smo pomocnu klasu Broj_zbrajanje,
el mi moze ko objasnit cemu ona sluzi mislim zakaj smo bas to tak radili.
Evo rjesenja zadatka:

Kod:
#include <iostream>
#include <string>

 using namespace std;
 
 [color=red]struct broj_zbrajanje;[/color]
 
 struct broj {
 
   int* znamenke;
   int duljina;
   broj(){}
   broj( const string );
   broj( const broj& );
   broj( [color=red]const broj_zbrajanje& x[/color] ){ *this = x; }
   broj& operator=( [color=red]const broj_zbrajanje&[/color] );
   ~broj();
   friend [color=red]broj_zbrajanje[/color] operator+( const broj&, const broj& );         
       
       
 };
 
[color=red] struct broj_zbrajanje{
 
      const broj& a;
      const broj& b;
      broj_zbrajanje( const broj& a, const broj& b ): a( a ), b( b ) {}       
       
 };[/color]
 
 broj::broj( const string s ){
 
            duljina = s.size();
            znamenke = new int[ duljina ];
           
            for( int i = 0; i < duljina; i++ )
                znamenke[i] = s[i] - '0';     
                         
 }
 
 broj::broj( const broj& x ){
 
            znamenke = new int[ x.duljina ];
            duljina = x.duljina;
            for( int i = 0; i < duljina; i++ )
               znamenke[i] = x.znamenke[i];             
             
 }
 
 broj& broj::operator=([color=red] const broj_zbrajanje& x[/color] ){
 
       if( znamenke ) delete [] znamenke;
       int max = x.a.duljina;
       int a = x.a.duljina - 1,b = x.b.duljina - 1, c = 0;
       if( x.b.duljina > max ) max = x.b.duljina;
       znamenke = new int[ max + 1 ];
       duljina = max + 1;
       for( int i = max; i >= 0; i-- ){
           int suma_a = (a >= 0) ? x.a.znamenke[a] : 0;
           int suma_b = (b >= 0) ? x.b.znamenke[b] : 0;
           a--;b--;
           znamenke[i]=(suma_a+suma_b+c)%10;
           c = (suma_a+suma_b+c)/10;
           
       }
           
             
       
 }
 
 broj_zbrajanje operator+( const broj& x, const broj& y ){
               return [color=red]broj_zbrajanje( x, y )[/color];
     
 }
 
 void ispis( const broj& x ){
 
           if( x.znamenke[0] != 0 )
                cout << x.znamenke[0];
           for( int i = 1; i < x.duljina; i++ )
             
               cout << x.znamenke[i];
               cout << endl;
               
     
 }
 
 broj::~broj(){ if( znamenke ) delete [] znamenke; }
 
 
 
 int main(){
     
  broj a("99999999999999999999999999999");
  broj b("1");
 
  broj c = a + b;

  ispis( c );   
       
     
  system("pause");
  return 0;   
     
 }


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 17:02 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

Usporedimo "normalno" zbrajanje i ovakvo sa pomoćnom klasom:

nek imamo naredbu C=A+B;

1. "normalno" zbrajanje
- imali bismo fju oblika
[code:1]broj operator+(const broj& a, const broj& b)[/code:1]
tu bi najprije konstruirali novi veiki broj C, napravili operaciju, i onda to vratili. Pri tom vraćanju se zove copy-konstruktor koji tu privremenu varijablu unutar fje kopira u privremenu van fje, i onda još jedan copy-konstruktor koji tu privremenu kopira u naš C iz maina. Dakle 2 kopiranja bezveze, i 2 destruktora bezveze (za te privremene varijable)

2. pomoću pomoćne klase.
Ideja je napraviti malu klasu, koja će se sama brinuti o zbrajanju, i da to bude bez nepotrebnog kopiranja.
Klasu_zbrajanje napravimo samo tako da čuva dvije reference na brojeve koje treba zbrojiti (reference su mali objekti). Operator + napravimo da vraća klasu_zbrajanje, a onda izraz C=A+B tumačimo kao da velikom broju pridružujemo klasu_zbrajanje (koju vrati +). Dakle, jedini posao koji se tu događe je na operatoru =, i fja
[code:1]broj& operator=( const broj_zbrajanje& x ){ [/code:1]
vraća veliki broj, koji je dobiven kao zbroj referenci koje čuva klasa zbrajanje. Jer vraća referencu na broj, nema dodatnog kopiranja.



A imam i ja pitanje, kako napraviti vektor sa pametnim pokazivačem? Jesu li to dvije odvojene klase, dje se provjerava koji operator [] je pozvan, kada sve konstruirati novi objekt?

I ja sam matricu (najjednostavnije mi je bilo) implementirao C-ovski, kao dupli pointer. No, tad nema nekog smisla radit razliku između dijagonalne i obične...
Usporedimo "normalno" zbrajanje i ovakvo sa pomoćnom klasom:

nek imamo naredbu C=A+B;

1. "normalno" zbrajanje
- imali bismo fju oblika
Kod:
broj operator+(const broj& a, const broj& b)

tu bi najprije konstruirali novi veiki broj C, napravili operaciju, i onda to vratili. Pri tom vraćanju se zove copy-konstruktor koji tu privremenu varijablu unutar fje kopira u privremenu van fje, i onda još jedan copy-konstruktor koji tu privremenu kopira u naš C iz maina. Dakle 2 kopiranja bezveze, i 2 destruktora bezveze (za te privremene varijable)

2. pomoću pomoćne klase.
Ideja je napraviti malu klasu, koja će se sama brinuti o zbrajanju, i da to bude bez nepotrebnog kopiranja.
Klasu_zbrajanje napravimo samo tako da čuva dvije reference na brojeve koje treba zbrojiti (reference su mali objekti). Operator + napravimo da vraća klasu_zbrajanje, a onda izraz C=A+B tumačimo kao da velikom broju pridružujemo klasu_zbrajanje (koju vrati +). Dakle, jedini posao koji se tu događe je na operatoru =, i fja
Kod:
broj& operator=( const broj_zbrajanje& x ){

vraća veliki broj, koji je dobiven kao zbroj referenci koje čuva klasa zbrajanje. Jer vraća referencu na broj, nema dodatnog kopiranja.



A imam i ja pitanje, kako napraviti vektor sa pametnim pokazivačem? Jesu li to dvije odvojene klase, dje se provjerava koji operator [] je pozvan, kada sve konstruirati novi objekt?

I ja sam matricu (najjednostavnije mi je bilo) implementirao C-ovski, kao dupli pointer. No, tad nema nekog smisla radit razliku između dijagonalne i obične...



_________________
"Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
bleki88
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 24. 09. 2009. (17:13:58)
Postovi: (27)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 17:34 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

Jos malo pitanja:

kaj znaci *this=x u onom konstruktoru koji prima broj_zbrajanje

i kaj onda radi operator jednako u npr B=A a A i B su već negdje prije definirani Brojevi
Jos malo pitanja:

kaj znaci *this=x u onom konstruktoru koji prima broj_zbrajanje

i kaj onda radi operator jednako u npr B=A a A i B su već negdje prije definirani Brojevi


[Vrh]
Korisnički profil Pošaljite privatnu poruku
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 17:43 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

Taj konstruktor tu uopće ne treba, ne znam zašto je stavljen...

a operator= se može preopteretiti baš kao i bilo koji drugi operator. Pa kada prima obični broj, da napravi pridruživanje na kakvo smo navikli, kad prima klasu_zbrajanje, da napravi zbrajanje itd.

A u ovom tvom primjeru sa A i B bi operator= na naredbi A=B napraviti:
1. obrisat kaj je prije bilo u A.
2. alocirat memoriju da stane sve iz B
3. kopirat sve iz B na tu novo alociranu memoriju

- kod A=A se ništa ne bi trebalo desit, to provjeri na početku inače ak napraviš dealokaciju sve gubiš
Taj konstruktor tu uopće ne treba, ne znam zašto je stavljen...

a operator= se može preopteretiti baš kao i bilo koji drugi operator. Pa kada prima obični broj, da napravi pridruživanje na kakvo smo navikli, kad prima klasu_zbrajanje, da napravi zbrajanje itd.

A u ovom tvom primjeru sa A i B bi operator= na naredbi A=B napraviti:
1. obrisat kaj je prije bilo u A.
2. alocirat memoriju da stane sve iz B
3. kopirat sve iz B na tu novo alociranu memoriju

- kod A=A se ništa ne bi trebalo desit, to provjeri na početku inače ak napraviš dealokaciju sve gubiš



_________________
"Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
bleki88
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 24. 09. 2009. (17:13:58)
Postovi: (27)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 17:46 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

e super, puno jasnije, fala
e super, puno jasnije, fala


[Vrh]
Korisnički profil Pošaljite privatnu poruku
matmih
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 12. 2006. (22:57:42)
Postovi: (1A4)16
Spol: muško
Sarma = la pohva - posuda
36 = 51 - 15
Lokacija: {Zg, De , Ri}

PostPostano: 19:26 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

[quote="Luuka"]
A imam i ja pitanje, kako napraviti vektor sa pametnim pokazivačem? Jesu li to dvije odvojene klase, dje se provjerava koji operator [] je pozvan, kada sve konstruirati novi objekt?

I ja sam matricu (najjednostavnije mi je bilo) implementirao C-ovski, kao dupli pointer. No, tad nema nekog smisla radit razliku između dijagonalne i obične...[/quote]

Generalno je smart pointer parametrizirana klasa koja se brine za dealokaciju objekta na koji pokazuje. Ostalo će trebat odgovorit netko tko rješava zadaću.

Glede matrice, ima dosta smisla raditi posebnu klasu za dijagonalne matrice, zato šta ti je u tom slučaju dosta zapamtit samo elemente na dijagonali u jedno polje i možeš rekonstruirat cijelu matricu, a memorijska potrošnja je znatno smanjena.
Generalno (kolko ja znam) se u C++ matrice spremaju u polje, a onda je lako indekse izvuči iz njega. :)

Naravno kod mješovitih operacija tipa zbrajanje između dijagonalne i full matrice rezultat će biti full matrica, s druge strane Hadamardov produkt će proizvesti dijagonalnu matricu... :)
Luuka (napisa):

A imam i ja pitanje, kako napraviti vektor sa pametnim pokazivačem? Jesu li to dvije odvojene klase, dje se provjerava koji operator [] je pozvan, kada sve konstruirati novi objekt?

I ja sam matricu (najjednostavnije mi je bilo) implementirao C-ovski, kao dupli pointer. No, tad nema nekog smisla radit razliku između dijagonalne i obične...


Generalno je smart pointer parametrizirana klasa koja se brine za dealokaciju objekta na koji pokazuje. Ostalo će trebat odgovorit netko tko rješava zadaću.

Glede matrice, ima dosta smisla raditi posebnu klasu za dijagonalne matrice, zato šta ti je u tom slučaju dosta zapamtit samo elemente na dijagonali u jedno polje i možeš rekonstruirat cijelu matricu, a memorijska potrošnja je znatno smanjena.
Generalno (kolko ja znam) se u C++ matrice spremaju u polje, a onda je lako indekse izvuči iz njega. Smile

Naravno kod mješovitih operacija tipa zbrajanje između dijagonalne i full matrice rezultat će biti full matrica, s druge strane Hadamardov produkt će proizvesti dijagonalnu matricu... Smile


[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
Luuka
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54)
Postovi: (925)16
Spol: muško
Sarma = la pohva - posuda
188 = 301 - 113
Lokacija: Hakuna Matata

PostPostano: 19:42 pon, 19. 4. 2010    Naslov: Citirajte i odgovorite

Ma jasno da ima smisla radit dijagonalnu, ali ako implementuram kao dupli pointer, onda moram skroz razdvojit te dvije strukture, a na to se ne cilja, bar mislim da ne... a i ovako kak radim se compiler buni na sve i svašta, makar i najjednostavnije A[i][j]+B[i][j]... jel ima neka dobra duša da ukratko opiše pametne pointere u ovom slučaju i kako same strukture izgledaju, gdje ide koja provjera i slično?
Ma jasno da ima smisla radit dijagonalnu, ali ako implementuram kao dupli pointer, onda moram skroz razdvojit te dvije strukture, a na to se ne cilja, bar mislim da ne... a i ovako kak radim se compiler buni na sve i svašta, makar i najjednostavnije A[i][j]+B[i][j]... jel ima neka dobra duša da ukratko opiše pametne pointere u ovom slučaju i kako same strukture izgledaju, gdje ide koja provjera i slično?



_________________
"Bolje bi prolazio na faxu da sam na drogama nego na netu" - by a friend of mine
"Poslije spavanja doma spavanje bilo di mi je najdraža stvar" - by the same guy Very Happy
[Vrh]
Korisnički profil Pošaljite privatnu poruku Pošaljite e-mail
jelenko*
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 07. 11. 2006. (17:40:41)
Postovi: (6)16
Sarma = la pohva - posuda
= 1 - 0

PostPostano: 19:07 uto, 20. 4. 2010    Naslov: Zašto mi ovaj kod ne radi? klasa vektor. Citirajte i odgovorite

Radi se o klasi vektor koja bi se trebala ponašati kao pametni pokazivač, dakle ima nekakvo brojanje referenci itd, itd.... većina toga mi je proradila, sve super, ali zanima me zašto mi funkcionira doljnji kod. Kopirao sam samo dio koji mislim da je bitan.

Zašto mi ne radi ova funkcionalnost kakvu želim postići u mainu?
Želim moći konstruirati objekt tipa vektor iz proizvoljnog polja brojeva.

Što moram promijeniti u klasi da bi mi to proradilo?


#include <vector>
using namespace std;

template<typename TIP>
class vektor
{
public:
typedef unsigned int index;

struct vektorRep
{
int m_refCount;
index _size;
TIP* _data;

template <typename T, index N>
vektorRep( index N, T* r )
:m_refCount(1), _size(N), _data( new TIP[N])
{
for(index i=0; i<_size; ++i) *(_data+i) = *(r+i);
}
};

private:
vektorRep* rep;

public:

template<typename T, index N>
vektor(T (&p)[N]) : rep(new vektorRep( N, p) ) { }


};

void main()
{
double p3[]={1,2,3,4,5};
vektor<double> v4(p3);

system("pause");
}
Radi se o klasi vektor koja bi se trebala ponašati kao pametni pokazivač, dakle ima nekakvo brojanje referenci itd, itd.... većina toga mi je proradila, sve super, ali zanima me zašto mi funkcionira doljnji kod. Kopirao sam samo dio koji mislim da je bitan.

Zašto mi ne radi ova funkcionalnost kakvu želim postići u mainu?
Želim moći konstruirati objekt tipa vektor iz proizvoljnog polja brojeva.

Što moram promijeniti u klasi da bi mi to proradilo?


#include <vector>
using namespace std;

template<typename TIP>
class vektor
{
public:
typedef unsigned int index;

struct vektorRep
{
int m_refCount;
index _size;
TIP* _data;

template <typename T, index N>
vektorRep( index N, T* r )
:m_refCount(1), _size(N), _data( new TIP[N])
{
for(index i=0; i<_size; ++i) *(_data+i) = *(r+i);
}
};

private:
vektorRep* rep;

public:

template<typename T, index N>
vektor(T (&p)[N]) : rep(new vektorRep( N, p) ) { }


};

void main()
{
double p3[]={1,2,3,4,5};
vektor<double> v4(p3);

system("pause");
}


[Vrh]
Korisnički profil Pošaljite privatnu poruku
bleki88
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 24. 09. 2009. (17:13:58)
Postovi: (27)16
Sarma = la pohva - posuda
= 2 - 0

PostPostano: 18:24 čet, 13. 5. 2010    Naslov: Citirajte i odgovorite

se tko sjeca na vjezbama kako smo promijenili naslov prozora iz edit controla
se tko sjeca na vjezbama kako smo promijenili naslov prozora iz edit controla


[Vrh]
Korisnički profil Pošaljite privatnu poruku
frances
Forumaš(ica)
Forumaš(ica)


Pridružen/a: 15. 07. 2006. (18:27:06)
Postovi: (39)16
Spol: žensko
Sarma = la pohva - posuda
= 9 - 1

PostPostano: 17:48 sri, 19. 5. 2010    Naslov: Citirajte i odgovorite

da ne otvaram novu temu. dosli rezultati kolokvija [url=http://web.math.hr/~vpetrice/OP/Bodovi.html]klik[/url]
da ne otvaram novu temu. dosli rezultati kolokvija klik


[Vrh]
Korisnički profil Pošaljite privatnu poruku MSNM
Prethodni postovi:   
Započnite novu temu   Odgovorite na temu   printer-friendly view    Forum@DeGiorgi: Početna -> Kolegiji diplomskih i starih studija -> Objektno programiranje (C++) Vremenska zona: GMT + 01:00.
Idite na 1, 2  Sljedeće
Stranica 1 / 2.

 
Forum(o)Bir:  
Možete otvarati nove teme.
Možete odgovarati na postove.
Ne možete uređivati Vaše postove.
Ne možete izbrisati Vaše postove.
Ne možete glasovati u anketama.
You can attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2002 phpBB Group
Theme created by Vjacheslav Trushkin
HR (Cro) by Ančica Sečan