![]() |
![]() |
|
Programiranje Programski jezici, tehnike, alatke... |
![]() |
|
Alatke vezane za temu | Vrste prikaza |
![]() |
#1 |
Veteran
|
![]()
Kako krenem da ucim jezik, tako pocinju teme How to....
![]() Kod: Spoiler za Kod:
I izlazi mi stalno problem "vector subscript out of range", a ja nemam pojma kako to da popravm.Video sam da ima neke veze sa indeksima elemenata, ali ja ne vidim problem. |
![]() |
![]() |
![]() |
#2 |
Član
|
![]()
Pogledao sam malo kod iako nisam najbolje ukapirao sta pokusavas, ali koliko vidim ti pravis ovakav input "less nekistring" ili "add nekistring" i u tom slucaju se desava error.
Problem je sto ti kad koristis >> on ne izvuce celu recinicu vec samo prvu rec do whitespace-sa i ti kad pristupas x[1] to je nepostojece i prekoracavas granice vektora i otuda ta greska ptistupas necemu sto nema, uglavnom kad imas takvu gresku znaci da si prekoracio granice vektora. Mozes da koristis getline() da bi uzeo celu linuju, uostalom vidi da li je to greska pa se snadji ![]() |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku NISAM NESTO SMART na korisnoj poruci: | ||
Ivan-94 (27.1.2012) |
![]() |
#3 |
Veteran
|
![]()
E sad jos jedan program...
kod: Spoiler za kod:
I uvek dobijam neki cudni output kao: 0x28fe78. |
![]() |
![]() |
![]() |
#4 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
![]() Kod:
cout << tst.str(); Kod:
//#include <string.h> // fflush(stdin) #include <limits> #ifdef max // glupavi M$ makro #undef max #endif ... cin.ignore( numeric_limits< streamsize >::max(), '\n'); cin.get(); Poslednja ispravka: Belphegor (27.1.2012 u 15:40) |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci: | ||
Ivan-94 (27.1.2012) |
![]() |
#5 |
V.I.P. Programiranje
|
![]()
Možda sam zakasnio, ali @Ivan-94, prvi post: taj pristup će ti probiti vremenski limit u tom zadatku. (O-recnik, kvalifikacije za okružno 2012, ako se ne varam.) Probaj da razmisliš koju strukturu podataka da iskoristiš kako bi malo efikasnije tražio i dodavao reči
![]() |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku Geomaster na korisnoj poruci: | ||
Ivan-94 (28.1.2012) |
![]() |
#6 |
Član
|
![]()
Da ne otvaram novu temu a imamm pitanje vezano za C++. Kako biste u matricu 9x9, nasumično smestili 81 broj na što brži način?
Evo mog pokušaja, iz nekog razloga ne štampa ništa: Kod:
#include<iostream> #include <stdlib.h> #include <time.h> using namespace std; int randomBroj() { srand ( time(NULL) ); int random = rand() %9; return random; } int main() { int indexi[9][9],i=0,x,y; for(int a=0;a<9;a++) { for(int b=0;b<9;b++) { indexi[a][b]=0; } } while(i<81) { x=randomBroj(); //funkcija koja vraca y=randomBroj(); //nasumicni broj u intervalu 0-8 if(indexi[x][y]==0) { indexi[x][y]=i+1; i++; } } for(int a=0;a<9;a++) { for(int b=0;b<9;b++) { cout<<indexi[a][b]; } } getchar(); getchar(); } Poslednja ispravka: Luigi (9.2.2012 u 15:10) |
![]() |
![]() |
![]() |
#7 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
![]()
Nije mi bas jasno tvoje pitanje?
Mslim da ti treba ovaj algo random_shuffle ? edit: Izbaci iz funkcije srand, jer je dovoljno samo jedanput pozvati, stavi je u "main". Poslednja ispravka: Belphegor (9.2.2012 u 17:16) |
![]() |
![]() |
Sledeći korisnik se zahvaljuje korisniku Belphegor na korisnoj poruci: | ||
EclipsE (9.2.2012) |
![]() |
#8 |
Član
|
![]()
Da dobar je algoritam. Mada ovo sa pomeranjem srand dela rešava stvar. Gledao sam u dokumentaciju ali mi je taj deo promakao...
![]() Poslednja ispravka: Luigi (10.2.2012 u 0:43) |
![]() |
![]() |
![]() |
#9 |
Veteran
|
![]()
Deklarisi promenjive izvan main funkcije (automatski ce vrednosti da im se postave na 0), da ne bi morao da ih ti popunjavas sa nulama.
|
![]() |
![]() |
![]() |
#10 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
![]()
Nemoj da ga navlacis na globalne promenljive, od toga se tesko odvikava/skida.
![]() ![]() Ako ga mrzi da pise petlju, moze i ovako: Kod:
int main() { int indexi[9][9] = {0}; ...ili int indexi[9][9]; memset(indexi, 0, sizeof(int) * 9 * 9); } |
![]() |
![]() |
![]() |
#12 |
Veteran
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
|
![]()
Imam pitanje života ili smrti.
![]() Kako u C++-u može da se radi compound assignment nad promenljivom koje deklarisana kao enum tipa, a da mi kompajler ne baci drvlje i kamenje. Jel ima neki switch kompajlera koji će da mu naredi da samo proguta to jer je enum samo int. Ako nema, kako se ovo radi najlakše? Ide ovako: Kod:
enum TehFlagz { Flag1 = 1, Flag2 = 2, Flag3 = 4, Flag4 = 8 }; class TehClass { TehFlagz flagz; public: void setFlagz(TehFlagz someFlagz) {flagz |= someFlagz;} void unsetFlagz(TehFlagz someFlagz) {(flagz |= someFlagz) ^= domeFlagz} }; // i onda int main(void) { TehClass obj; obj.setFlagz(Flag1 | Flag2); obj.unsetFlagz(Flag3 | Flag4); } Poslednja ispravka: ivan90BG (10.2.2012 u 23:02) |
![]() |
![]() |
![]() |
#13 | |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
![]()
Ne mozes te operatore na enumaraciju!
Koliko vidim po tvom kodu hoces da drzis flagove u enumaraciji, onda moras drugacije i koristiti: Kod:
enum TehFlagz { Flag1 = 1, Flag2 = 2, Flag3 = 4, Flag4 = 8 }; class TehClass { int flagz; public: void setFlagz(TehFlagz someFlagz) {flagz |= someFlagz;} void unsetFlagz(TehFlagz someFlagz) { flagz &= ~someFlagz; } }; // i onda int main(void) { TehClass obj; obj.setFlagz(Flag1 | Flag2); obj.unsetFlagz(Flag3 | Flag4); } Mozes samo da postavis na neki element koji ima: Kod:
TehFlagz f; ... f = Flag2;//recimo 2. Citat:
Ovaj izraz je RValue: Kod:
Flag3 | Flag4 Kod:
void foo(int i) { // mozes uzeti adresu od i } |
|
![]() |
![]() |
![]() |
#14 |
Veteran
Član od: 3.5.2008.
Lokacija: Beograd
Poruke: 760
Zahvalnice: 81
Zahvaljeno 213 puta na 144 poruka
|
![]()
Da, da , vidim šta je po sredi. Mora jednostavno promenljiva da se deklariše kao int, da bi članovi enum-a mogli da se koriste kao flag-ovi.
Srećom u međuvremenu sam otkrio da Qt biblioteka ima rešenje za ovo. QFlags tempalete klasu koja wrapuje bilo koji enum i omogućava sve ovo. Kod:
enum AFlag { Flag1 = 1, Flag2 = 2, Flag3 = 4, Flag4 = 8 }; typedef QFlags<AFlag> SomeFlags; ili Q_DECLARE_FLAGS(SomeFlags, AFlag) i onda može SomeFlags f = Flag1 | Flag2; f |= Flag3; (f |= Flag2) ^= Flag2 |
![]() |
![]() |
![]() |
#15 |
Veteran
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
|
![]()
Standardna biblioteka ima bitset, koja bi mogla da ti koristi.
Primer: Kod:
#include <iostream> #include <bitset> enum { Flag1 = 0, Flag2, Flag3, Flag4 }; typedef std::bitset<4> Flags; std::string printbool( bool value ) { return (value ? "true" : "false"); } std::ostream& operator << ( std::ostream& str, Flags const& value ) { str << "Flags {" << std::endl; str << "\tFlag1 = " << printbool(value[Flag1]) << std::endl; str << "\tFlag2 = " << printbool(value[Flag2]) << std::endl; str << "\tFlag3 = " << printbool(value[Flag3]) << std::endl; str << "\tFlag4 = " << printbool(value[Flag4]) << std::endl; str << "}" << std::endl; return str; } int main() { Flags flags; flags.set(Flag1, true); flags.set(Flag2, false); flags.set(Flag3, true); flags.set(Flag4, false); std::cout << flags << std::endl; flags = Flags(std::string("1011")); std::cout << flags << std::endl; flags = Flags(0x3); // 0011 std::cout << flags << std::endl; return 0; } Kod:
Flags { Flag1 = true Flag2 = false Flag3 = true Flag4 = false } Flags { Flag1 = true Flag2 = true Flag3 = false Flag4 = true } Flags { Flag1 = true Flag2 = true Flag3 = false Flag4 = false } |
![]() |
![]() |
![]() |
#17 |
Veteran
|
![]()
Ucim c++ i pokusavam da napisem funkciju za split-ovanje stringa, to sam uradio ovako:
Kod:
char* split(char *str, char *delimM) { char * temp; char* part = strtok(str, delimM); while(part != nullptr) { *temp++ = *part; part = strtok(nullptr, delimM); } return temp; } Kod:
char *g = split("Haha:GG:HH:HH:PP", ":"); cout << g[0] << endl; |
![]() |
![]() |
![]() |
#18 |
Starosedelac
|
![]()
Moraš da alociraš memoriju prvo pre nego što je koristiš.
|
![]() |
![]() |
![]() |
#19 |
Veteran
Član od: 27.12.2005.
Lokacija: Vremenske Grobnice, Hiperion
Poruke: 680
Zahvalnice: 99
Zahvaljeno 124 puta na 82 poruka
|
![]()
Jedan mali savet. Pošto radiš u C++-u izbegavaj raw pointere ako ikako možeš. Ovo naravno neće uvek biti moguće. Takođe, ako si učio C pre C++-a, probaj, ako ikako možeš, da se odvikneš od C stila. Pogledaj, recimo, Bjarne Stroustrup's C++ Style and Technique FAQ za ideju šta bi to bio C++ stil.
U tvom slučaju, nemoj stringove da predstavljaš char* tipom, umesto toga koristi std::string. Takođe, strtok modifikuje ulazni string, što može da ti napravi silne probleme ako ne paziš. Elem, evo ga string splitter, C++ style. Kod:
#include <string> #include <vector> std::vector<std::string> split(std::string const& str, std::string const& delim) { std::vector<std::string> result; unsigned last_pos = 0; unsigned pos = 0; while( ( pos = str.find(delim, pos) ) != str.npos ){ string current = str.substr(last_pos, pos-last_pos); if(current.length() != 0) result.push_back(current); pos += delim.length(); last_pos = pos; } if(last_pos != str.length()){ string current = str.substr(last_pos, str.length()-last_pos); result.push_back(current); } return result; } ![]() Kod:
#include <string> #include <vector> template<typename CharType> std::vector<std::basic_string<CharType> > split(std::basic_string<CharType> const& str, std::basic_string<CharType> const& delim) { std::vector<std::basic_string<CharType> > result; unsigned last_pos = 0; unsigned pos = 0; while( ( pos = str.find(delim, pos) ) != str.npos ){ string current = str.substr(last_pos, pos-last_pos); if(current.length() != 0) result.push_back(current); pos += delim.length(); last_pos = pos; } if(last_pos != str.length()){ string current = str.substr(last_pos, str.length()-last_pos); result.push_back(current); } return result; } |
![]() |
![]() |
![]() |
#20 |
V.I.P. Programiranje
Član od: 29.8.2007.
Lokacija: Valjevo
Poruke: 1.349
Zahvalnice: 983
Zahvaljeno 371 puta na 280 poruka
|
![]()
Samo da dodam. Mislim da u tvom primeru mogu da se izbegnu extra kopije sa:
Kod:
template<typename CharType> std::vector<std::basic_string<CharType> > split(std::basic_string<CharType> const& str, std::basic_string<CharType> const& delim) { std::vector<std::basic_string<CharType> > result; std::size_t last_pos = 0; std::size_t pos = 0; while( ( pos = str.find(delim, pos) ) != str.npos ){ std::basic_string<CharType> current = str.substr(last_pos, pos-last_pos); if(current.length() != 0) result.push_back(std::move(current)); pos += delim.length(); last_pos = pos; } if(last_pos != str.length()){ std::basic_string<CharType> current = str.substr(last_pos, str.length()-last_pos); result.push_back(std::move(current)); } return result; } Mada ovo zavisi od kompajlera ako podrzava "move semanitics". Poslednja ispravka: Belphegor (12.2.2012 u 19:46) Razlog: std::string --> std::basic_string<CharType> & unsigned --> std::size_t |
![]() |
![]() |
![]() |
Bookmarks sajtovi |
Tagovi |
c++, how to, pomoc, programiranje |
Alatke vezane za temu | |
Vrste prikaza | |
|
|