C++ zadatak

poruka: 19
|
čitano: 3.030
|
moderatori: Lazarus Long, XXX-Man, vincimus
1
+/- sve poruke
ravni prikaz
starije poruke gore
16 godina
neaktivan
offline
C++ zadatak

Pozdrav!

 

Evo imam problema s STL-ima, tocnije s vektorom i mappingom, dvije funkcije, pa ako netko ima vremena i volje za pogledat kod i doradit neka se javi na pm.

 

Thnx unaprijed =)

 
0 0 hvala 0
17 godina
offline
C++ zadatak

Postaj ovdje.

 
0 0 hvala 0
16 godina
neaktivan
offline
C++ zadatak

1. funkcija

-prima vektor stringova, vraca vektor  permutiranih stringova tako da su oni palindromi max duljine(ako za jedan string ima vise  takvih vraca najmanji obzirom na leksikograf uredjaj, velika slova dolaze prie malih), prvo iz svakog stringa izbaci sve sto nije slovo; npr  "abA", "bdc", "Dca", "abecbdac" - "Aba", "b", "D", "abcdcba"

 

#include<iostream>
#include<string>

#include<cctype>
#include<set>

using namespace std;

vector<string> permutirani_palindromi( vector<string> v){
string s;
vector<string> P;

for(int i=0; i<v.size(); i++) { s=v[i];
   for(int j=0; j<s.size(); j++)
      if(!isalpha(s[j])) s.erase(j); }

for(int i=0; i<v.size(); i++) { s=v[i];
   multiset<char> S;
   for(int j=0; j<s.length(); j++) S.insert(s[j]);   
   multiset<char>::iterator si;  string p;
    for(si=S.begin(); si!=S.end();){
      
        if (!(S.count(*si)%2)) {p.insert(p.length()/2, S.count(*si), (*si) );
                                multiset<char>::iterator temp;
                                for(int k=0; k<S.count(*si); k++) {temp=si; si++;
                                S.erase(temp);}
                                }             
        if((S.count(*si)%2) && (S.count(*si)>1)){ p.insert(p.length()/2, S.count(*si)-1, (*si) );             
                                                multiset<char>::iterator temp;
                                                for(int k=0; k<S.count(*si)-1; k++) {temp=si; si++;
                                                S.erase(temp); }
                                                }
       if(S.count(*si)==1)  si++;
                                }
       for(si=S.begin(); si!=S.end();si++) if( S.count(*si)==1)
                                                 {p.insert(p.length()/2, 1, (*si)); break;}
       P.push_back(p);                                                              }        
return P;     
}

 

ideja mi je bila za svaki string svaki char stavit u multiskup jer ce se tako odmah sortirat pa ce bit lakse nac max palindrome, al negdje sam ocito pogrijesila jer ne ispisuje sta bi trebala..

Poruka je uređivana zadnji put sri 29.4.2009 22:57 (brenda).
 
0 0 hvala 0
16 godina
neaktivan
offline
C++ zadatak

Nisam citao kod pa nisam siguran da ti je greska u algoritmu, ali jednu stvar uocavam:

 

vektor koji vracas je alociran na stack frameu, koji se normalno unistava kad se funkcija vraca. To ce izazvati segfault kad pristupis vracenom vektoru. Takodjer, vektor stringova koji predajes u funkciju se KOPIRA u stack frame funkcije, a otprilike sam 99% siguran da to ne zelis. Ako sam pogodio problem, onda imas dvije opcije:

 

a) alociraj vektor na heapu i vrati objekt zawrappan u auto_ptr ili nesto slicno

b) promjeni return vrijednost na void i predaj referencu na vektor pozivatelja kroz 'out' parametar, alociran na stacku

 

Moj savjet je b.

Dakle, promjeni funkciju

 

void blablaNestoUVeziPalindroma(vector<string>& in, vector<string>& out) {

// modificiraj out

}

 

Pa vidi da li radi.

 

 

P.S.

Downloadiraj si i iskompiliraj astyle i daj mu nek ti formatira kod. Ne razumijem kako mozes citati ove spagete, a kamoli debugirati.

Poruka je uređivana zadnji put čet 30.4.2009 14:58 (Deus ex machina).
 
0 0 hvala 1
17 godina
offline
RE: C++ zadatak
Deus ex machina kaže...

vektor koji vracas je alociran na stack frameu, koji se normalno unistava kad se funkcija vraca. To ce izazvati segfault kad pristupis vracenom vektoru. Takodjer, vektor stringova koji predajes u funkciju se KOPIRA u stack frame funkcije, a otprilike sam 99% siguran da to ne zelis. Ako sam pogodio problem, onda imas dvije opcije:

 
Vector se kopira kod vraćanja.
16 godina
neaktivan
offline
C++ zadatak

Stvarno sam ostario.

Moja greska.

 
0 0 hvala 0
17 godina
offline
C++ zadatak

Hehe, np, događa se svima.

 

Što se tiće koda, nisam cijeli pročitao, ali primjetio sam na početku da u for petlji brišeš znakove, a ne smanjuješ brojač - neki znakovi će se preskočiti.

 
0 0 hvala 1
16 godina
neaktivan
offline
C++ zadatak

@Deus ex machina 

mora bit tocno onaj prototip, to je zadatak za dz i inzistira se na tom... ostatk sam slabo shvatilaSramim se, nisam potpuni pocetnik, al ni daleko od toga..

 

 

@itf4n

da, i ja sam primijetila to, al ne mogu direktno smanjit s.length(), vraca error, ako pak uvedem novu var l=s.length() i nju smanjim kod izbacivanja opet se ne izbaci sve sta bi trebalo.. savjet?

 
0 0 hvala 0
17 godina
offline
RE: C++ zadatak
brenda kaže...

@Deus ex machina 

mora bit tocno onaj prototip, to je zadatak za dz i inzistira se na tom... ostatk sam slabo shvatilaSramim se, nisam potpuni pocetnik, al ni daleko od toga..

 

 

@itf4n

da, i ja sam primijetila to, al ne mogu direktno smanjit s.length(), vraca error, ako pak uvedem novu var l=s.length() i nju smanjim kod izbacivanja opet se ne izbaci sve sta bi trebalo.. savjet?

size() ne moraš ručno "mjenjati", on će uvijek dati ispravnu vrijednost
Mislio sam na "j" u ovoj petlji:
   for(int j=0; j<s.size(); j++)
      if(!isalpha(s[j])) s.erase(j);
Rješenje je prilično jednostavno, samo zamijeni dojnju liniju sa:
      if(!isalpha(s[j])) s.erase(j--);

16 godina
offline
C++ zadatak

ja imam mali problemcic kada kompajliram javlja mi gresku a sve mi se cini da valja

#include <cstdlib>
#include <iostream>

using namespace std;

int main()
{
    float a = 2.71;
    float b = static_cast<int>a;
    cout<<b<<endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}


Moj PC  
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ zadatak

Ovako na brzinu: 

 

float b =static_cast<int>(a);

 

Znači zagrade ,a imaš i gubitak podataka pri castanju ....
Ima i boljih castanja i načina na koji se casta ali eto samo sam letimično pogledao...

Private
16 godina
offline
C++ zadatak

procitao sam da ima boljih tek se ucim

EDIT a u knjizi pise bez zagrade ne znam jel to u sklopu zadatka namjerno napravljena ta greska il sta...

Poruka je uređivana zadnji put pon 17.8.2009 15:23 (loky4i4).
Moj PC  
0 0 hvala 0
17 godina
offline
C++ zadatak

Hmm, pa ovaj način se preporuča... ima jednostavnijih, ali ovo je "najispravniji".

 

edit: onda je krivo u knjizi, mora biti ()

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
Poruka je uređivana zadnji put pon 17.8.2009 15:24 (itf4n).
 
0 0 hvala 0
16 godina
neaktivan
offline
RE: C++ zadatak

Koja je to knjiga..hmmmm....ne brini i na greškama se uči katkad i bolje nego da je sve ok...

Private
16 godina
offline
C++ zadatak

demistificirani c++

Moj PC  
0 0 hvala 0
17 godina
offline
RE: C++ zadatak
loky4i4 kaže...

demistificirani c++

 

Oo.

 

Daj stranicu i izdanje :O

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
16 godina
offline
C++ zadatak

2. izdanje str.51

Moj PC  
0 0 hvala 0
17 godina
offline
C++ zadatak

Uff, stvarno. (Iako, u zadatku je, možda su ciljali na to da skužiš kako je greška što fale zagrade).

 

The candle flame gutters. Its little pool of light trembles. Darkness gathers. The demons begin to stir.
 
0 0 hvala 0
16 godina
offline
C++ zadatak

mozda sam sto ja nisam skuzio trebao bih pripazit na zagrade

Moj PC  
0 0 hvala 0
1
Nova poruka
E-mail:
Lozinka:
 
vrh stranice