Prethodna tema :: Sljedeća tema |
Autor/ica |
Poruka |
charlotte Forumaš(ica)

Pridružen/a: 25. 04. 2006. (14:30:51) Postovi: (1E)16
|
Postano: 13:50 sub, 20. 3. 2010 Naslov: zadaci |
|
|
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] |
|
matmih Forumaš(ica)


Pridružen/a: 07. 12. 2006. (22:57:42) Postovi: (1A4)16
Spol: 
Lokacija: {Zg, De , Ri}
|
Postano: 14:36 sub, 20. 3. 2010 Naslov: |
|
|
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:
Tebi treba ovo:
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).
|
|
[Vrh] |
|
charlotte Forumaš(ica)

Pridružen/a: 25. 04. 2006. (14:30:51) Postovi: (1E)16
|
|
[Vrh] |
|
matmih Forumaš(ica)


Pridružen/a: 07. 12. 2006. (22:57:42) Postovi: (1A4)16
Spol: 
Lokacija: {Zg, De , Ri}
|
|
[Vrh] |
|
charlotte Forumaš(ica)

Pridružen/a: 25. 04. 2006. (14:30:51) Postovi: (1E)16
|
|
[Vrh] |
|
m00nblade Forumaš(ica)

Pridružen/a: 30. 10. 2005. (13:26:10) Postovi: (54)16
Spol: 
|
Postano: 18:15 sub, 20. 3. 2010 Naslov: |
|
|
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
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
_________________ Real programmers don't comment their code. If it was hard to write, it should be hard to read.
|
|
[Vrh] |
|
charlotte Forumaš(ica)

Pridružen/a: 25. 04. 2006. (14:30:51) Postovi: (1E)16
|
|
[Vrh] |
|
ivo34 Forumaš(ica)


Pridružen/a: 03. 02. 2005. (10:11:04) Postovi: (171)16
Spol: 
|
Postano: 18:36 ned, 21. 3. 2010 Naslov: |
|
|
[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 ? |
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...
|
|
[Vrh] |
|
Cobs Forumaš(ica)


Pridružen/a: 21. 01. 2008. (13:32:15) Postovi: (206)16
Spol: 
Lokacija: Geto
|
|
[Vrh] |
|
charlotte Forumaš(ica)

Pridružen/a: 25. 04. 2006. (14:30:51) Postovi: (1E)16
|
|
[Vrh] |
|
bleki88 Forumaš(ica)

Pridružen/a: 24. 09. 2009. (17:13:58) Postovi: (27)16
|
Postano: 16:40 pon, 19. 4. 2010 Naslov: |
|
|
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] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 17:02 pon, 19. 4. 2010 Naslov: |
|
|
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 
|
|
[Vrh] |
|
bleki88 Forumaš(ica)

Pridružen/a: 24. 09. 2009. (17:13:58) Postovi: (27)16
|
|
[Vrh] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 17:43 pon, 19. 4. 2010 Naslov: |
|
|
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 
|
|
[Vrh] |
|
bleki88 Forumaš(ica)

Pridružen/a: 24. 09. 2009. (17:13:58) Postovi: (27)16
|
|
[Vrh] |
|
matmih Forumaš(ica)


Pridružen/a: 07. 12. 2006. (22:57:42) Postovi: (1A4)16
Spol: 
Lokacija: {Zg, De , Ri}
|
Postano: 19:26 pon, 19. 4. 2010 Naslov: |
|
|
[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.
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...
|
|
[Vrh] |
|
Luuka Forumaš(ica)


Pridružen/a: 13. 02. 2007. (20:34:54) Postovi: (925)16
Spol: 
Lokacija: Hakuna Matata
|
Postano: 19:42 pon, 19. 4. 2010 Naslov: |
|
|
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 
|
|
[Vrh] |
|
jelenko* Forumaš(ica)


Pridružen/a: 07. 11. 2006. (17:40:41) Postovi: (6)16
|
Postano: 19:07 uto, 20. 4. 2010 Naslov: Zašto mi ovaj kod ne radi? klasa vektor. |
|
|
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] |
|
bleki88 Forumaš(ica)

Pridružen/a: 24. 09. 2009. (17:13:58) Postovi: (27)16
|
|
[Vrh] |
|
frances Forumaš(ica)

Pridružen/a: 15. 07. 2006. (18:27:06) Postovi: (39)16
Spol: 
|
|
[Vrh] |
|
|