Ja ne vidim potrebu za još jednu char varijablu koja će imati samo white space.
Zar ovo nije ljepše:
if(input[i] != ' ')
A usput uštedjeli smo 1, čak 1 (slovima: jedan) bajt. :)
Programiranje u C++-u - pitanja i odgovori
- poruka: 7.285
- |
- čitano: 1.716.923
- |
- moderatori:
Lazarus Long, XXX-Man, vincimus
- +/- sve poruke
- ravni prikaz
- starije poruke gore
Ja ne vidim potrebu za još jednu char varijablu koja će imati samo white space.
Zar ovo nije ljepše:
if(input[i] != ' ')
A usput uštedjeli smo 1, čak 1 (slovima: jedan) bajt. :)
hahhaha, ovo zvuči kao da je 1984. :)

To sam i prije napravio ali sam zaboravio dopisat.
Sad je error:
C:\Users\David\Dropbox\C++\NoSpace\main.cpp||In function 'int main()':|
C:\Users\David\Dropbox\C++\NoSpace\main.cpp|9|error: invalid conversion from 'const char*' to 'char' [-fpermissive]|
||=== Build finished: 1 errors, 0 warnings ===|
Čini mi se da imaš volje baviti se programmingom. To je uz intuitivnu logiku najvažnije. Jezik je čak manje bitan , bez ovog dvoje ništa od svega. SAVJET :: postani što prije friend s kompajlerom. ČITAJ debug informacije , tamo sve piše. Npr ovo gore C:\Users\David\Dropbox\C++\NoSpace\main.cpp|9|error: invalid conversion from 'const char*' to 'char'
odmah ti govori da u toj liniji radiš konverziju iz stringa() const char* to char. Ako znaš da je tako brzo ćeš zaključiti da je problem double parentheses " " jer njima iniciraš string. Kad znaš da je tako ,preostaje ti samo da ideš na ' ' koji iniciraju char.
Dalje , znam da te zbunjuju kobase tipa C:\Users\David\Dropbox\C++\NoSpace\main.cpp||In function 'int main()':|
C:\Users\David\Dropbox\C++\NoSpace\main.cpp|14|error: no match for 'operator!=' in 'input[i] != space'|
C:\Users\David\Dropbox\C++\NoSpace\main.cpp|14|note: candidates are:|
c:\mingw\bin\..\lib\gcc\mingw32\4.6.2\include\c++\bits\postypes.h|223|note: template<class _StateT> bool std::operator!=(const std::fpos<_StateT>&, const std::fpos<_StateT>&)|.................
To ti kompajler samo u najsitnije detalje definira grešku nabrajajući tebi potrebno i nepotrebno.
Slikovito template <class InputIterator>vector ( InputIterator first, InputIterator last, const Allocator& = Allocator() );
u prijevodu za tebe samo znaci da mozes konstruirati recimo vector<int> prvi(drugi.begin(),drugi.end());
Malo sam ti pojednostavnio ali uglavnom ne boj se tih kobasa i čitaj dbg.info i praksom ćeš naučiti izdvajati samo ono bitno za rješenje greške. Vježbaj čitati debug info recimo da kopiraš dio nejasnoća iz romana koji ti ispuca kompajler-> pa na google -> open par linkova -> nađi sebi najrazumljivije objašnjenje -> ispravi gešku(). Radi to stalno , pitaj ovdje , vježbaj i sam ćeš naučti čitati te ispravljati veliki dio grešaka.
char input[32] = " ";
Zašto inicijaliziraš input na znak za razmak? To nije potrebno (ne smeta, ali nije potrebno).
char output;
Output ti nije polje nego jedan jedini znak. Kako tu kaniš pohranjivati niz znakova?
for(int i; i < 31; i++)
!!!
Koja je početna vrijednost varijable 'i'?
output = output + input[i];
Što se ovdje događa? Zbrajaš ASCII vrijednosti znakova, eto što. Takvo nadodavanje jednog stringa na drugi možeš raditi samo sa C++ string objektima, a ne sa klasičnim C stringovima.
Koliko sam shvatio, ispravi me ako griješim, ti pokušavaš ukloniti sve razmake iz nekog upisanog teksta. To bi se moglo napraviti ovako:
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
char input[32], output[32]={0};
char space = ' ';
int n=0;
gets(input);
cout << input << endl;
for (int i=0; i<31; i++)
{
if (input[i] != space)
{
output[n]=input[i];
n++;
}
}
cout << output;
return 0;
}
Hvala rustweaver nisam primjetio.
Sad imam problem:
[KOD]
Kad upisem nesto prva lininije mi ispise sto sam napisao a druga bude samo ~
Di sam pogrjesio?
Imaš dosta propusta. Ono što sam vidio je sljedeće:
- Stavi radije biblioteku <cstdio> umjesto <stdio.h>, čisto zato što je stdio.h C biblioteka, a cstdio C++ biblioteka, a ti pišeš C++ program.
- Nepotrebno je stavljati "space" znak kao prvi član, nepotrebno je uopće upisivati znakove u polje u liniji u kojoj ga deklariraš da bi ga poslije mjenjao preko gets funkcije.
- Varijabla "space" ti nije baš potrebna.
- Varijabli "output" moraš dati vrijednost prije daljnjih operacija.
- Ti imaš polje od 32 znaka i ponavljaš petlju 32 puta. Ako upišeš u input polje recimo "Ovo je string", kompjuter će to polje vidjeti kao "Ovo je string_+4354#"%4Gr243GfR" te će sve znakove zbrajati ukoliko nisu "space". Tebi treba ovo:
for(i=0; i < strlen(input); i++)
strlen funkcija broji broj znakova u stringu (string length) te se nalazi u biblioteci <cstdlib> za C++ i <stdlib.h> za C. Evo i cjeloviti kod:
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
int main()
{
int i;
char input[32];
char output = 0;
gets(input);
cout << input << endl;
for(i = 0; i < strlen(input); i++)
{
if(input[i] != ' ')
{
output = output + input[i];
}
}
cout << output;
return 0;
}
@fireman
Možeš si to srediti i bez niza output, na primjer:
#include<iostream>
#include<cstdlib>
using namespace std;
int main()
{
char unos[50];
gets_s(unos);
for(int i=0; unos[i]!='\0'; i++)
{
if(unos[i] != ' ')
{
cout<<unos[i];
}
}
cout<<endl;
system("PAUSE");
return 0;
}

Kako da zbrajam(dodajem) stringovima?
Znaci ja imam jedno znakovno polje kroz koje se loopam i svaki put kad se sadrzaj polja slaze s uvjetom da dodam u taj string.
npr.
imam string davi i kako da dodam d (davi+d)?
Ako koristiš znakovna polja, to radiš funkcijom strcat iz cstdlib biblioteke, npr.:
char polje[5] = "Davi";
strcat(polje, "d");
puts(polje);
for(int i; i < 31; i++)
!!!
Koja je početna vrijednost varijable 'i'?
Zar nije deflautna vrijednost varijable 0?
for(int i; i < 31; i++)
!!!
Koja je početna vrijednost varijable 'i'?
Zar nije deflautna vrijednost varijable 0?
Po cemu bi bila i zasto bi bila?
Svaka varijabla je u pocetku neinicijalizirana, tj. laicki receno u njoj se nalazi smece, na tebi je da ju sam inicijaliziras na nulu.
laicki receno u njoj se nalazi smece
Memorijska adresa?
Memorijska adresa?
Ono sto se u tom trenutku nade na tom mjestu u memoriji. Moze biti nula, a moze biti neka varijabla koju je u tom dijelu memorije prije nego si ga ugasio koristio Firefox ili nesto trece. Smece uglavnom.
U Basicu i još nekim jezicima jest. U C-u i C++-u nije. Čitaj što domagoj kaže.
Pozdrav svima pocetnik sam pa imam jedan problem. Napravio sam program koji ispisuje jacinu karata u pokeru i sada kad sam stavio while-ove za ogranicenja dobio sam problem da mi kada sam trebam unijet vrijednost karata ne pondi pociju da unesem prvu i cetvrtu kartu pa ako netko ima vremena da pogleda i kaze mi u cemu je problem bio bi jako zahvalan.
Kod je linku jer je dosta dug.
Pozdrav svima pocetnik sam pa imam jedan problem. Napravio sam program koji ispisuje jacinu karata u pokeru i sada kad sam stavio while-ove za ogranicenja dobio sam problem da mi kada sam trebam unijet vrijednost karata ne pondi pociju da unesem prvu i cetvrtu kartu pa ako netko ima vremena da pogleda i kaze mi u cemu je problem bio bi jako zahvalan.
Kod je linku jer je dosta dug.
Ukratko, problem je u pogrešno postavljenoj while petlji, umjesto nečeg ovakvog:
while (R[1]<0 || R[1]>13) {
cout<<" Unesite vrijednost druge karte:";
cin>>R[1];
}
bi trebalo ići nešto ovakvo:
do {
cout<<" Unesite vrijednost druge karte:";
cin>>R[1];
}
while (R[1]<0 || R[1]>13);
Tako ćeš zajamčiti da se sadržaj petlje izvrši barem jedanput.
Kôd ti inače ima nekih neurednosti koje sam koliko toliko ispeglao. A tu je problem i ogromne monolitne main funkcije koja radi sve. Razbij to na više manjih funkcija, bit će se lakše snalaziti u svemu tome. Dobri kandidati za to su ti:
- onaj veliki if blok koji testira želi li korisnik sam upisati karte, ili želi da se nasumično generiraju. To bi se moglo razbiti u dvije funkcije koje bi pozivao iz maina.
- bubble sort petlja
- i sve one provjere kombinacija karata koje ispisuju vrijednost korisnikovih karata. To možeš ili sve pobacati u jednu veću zasebnu funkciju, ili svaku provjeru u vlastitu funkciju.
Još ću samo primijetiti da bubble sort ne sortira i boje. Sortiraju se samo vrste karata, tako da nakon sortiranja izgubiš vezu karata sa njihovim bojama (tj. boje ostanu na istim mjestima u polju, dok vrijednosti karata ne ostanu). To se lako omakne jer si razdvojio te dvije vrijednosti u dva različita polja. Ja bih napravio strukturu:
struct karta
{
int karta;
int boja;
};
I onda polja te strukture, itd...
Pozdrav svima pocetnik sam pa imam jedan problem. Napravio sam program koji ispisuje jacinu karata u pokeru i sada kad sam stavio while-ove za ogranicenja dobio sam problem da mi kada sam trebam unijet vrijednost karata ne pondi pociju da unesem prvu i cetvrtu kartu pa ako netko ima vremena da pogleda i kaze mi u cemu je problem bio bi jako zahvalan.
Kod je linku jer je dosta dug.
u 57 liniji koda promjeni S[5] u S[4]
57.line -- int S[4]; //dobivanje boje karata
poker ma 4 boje
Sad bi trebalo biti ok sto se tiče ponude karata ali ima grešaka runtime failure results tipa.
Uplete te ponekad u beskonačni loop.
stinsfire ovo zanemari , teški mistake
u 57 liniji koda promjeni S[5] u S[4]
57.line -- int S[4]; //dobivanje boje karata
poker ma 4 boje
Krivo si shvatio što se tu događa.
S i R su dva polja koja zajedno predstavljaju korisnikove karte, svaki ima 5 članova (za 5 karata).
'S' su boje za svaku od 5 karata
'R' su vrijednosti za svaku od 5 karata
npr.
R={kralj, as, dama, kralj, 10}
S={pik, pik, karo, herc, tref}
Malo je teže snaći se u nekim njegovim dizajnerskim odlukama, ali kako je čovjek lijepo rekao da je početnik nećemo mu to zamjerati previše.
Pozdrav svima pocetnik sam pa imam jedan problem. Napravio sam program koji ispisuje jacinu karata u pokeru i sada kad sam stavio while-ove za ogranicenja dobio sam problem da mi kada sam trebam unijet vrijednost karata ne pondi pociju da unesem prvu i cetvrtu kartu pa ako netko ima vremena da pogleda i kaze mi u cemu je problem bio bi jako zahvalan.
Kod je linku jer je dosta dug.
Daj vidi molim te od 113 linije na dalje imaš uvjete tipa
while (S[0]<0 || S[0]>3) {
cout<<" Unesite boju prve karte:";
cin>> S[0];
itd....
u tom trenu ti je ko zna šta u S[0] , S[1], ...
Ajde da ne čačkaš po dizajnu promjeni 57.liniju u ovo
int S[5] = {9,9,9,9,9}; /*iniciraj matricu uglavnom vecim brojevima od vrijednosti boja*/
i 56.liniju u
int R[5] = {19,19,19,19,19}; /*iniciraj matricu uglavnom vecim brojevima od vrijednosti karata*/
Hvala vam svima na pomoci i savjetima kao sto rekoh pocetnik sam pa se ne snalazim najbolje :/
Hvala vam svima na pomoci i savjetima kao sto rekoh pocetnik sam pa se ne snalazim najbolje :/
Zato smo tu. Radje brljam po nečijem kôdu, nego pišem sve od nule nekome tko se nije udostojao ni jednu liniju napisati. A vjerujem da nisam jedini ovdje koji ima takvo mišljenje.
;)
A vjerujem da nisam jedini ovdje koji ima takvo mišljenje
Naravno, zašto bih se ja mučio oko ičije zadaće, pa koliko ona trivijalna bila...
Napravio sam sve kako ste rekli ali mi se opet javlja ista stvar ne nudi mi da biram prvu kartu nego me direkt prebacuje na drugu.
Napravio sam sve kako ste rekli ali mi se opet javlja ista stvar ne nudi mi da biram prvu kartu nego me direkt prebacuje na drugu.
Hm, ovo nije jos nitko predlozio koliko mi se cini, a ako i je, rijetko se predlozi, ali jesi li probao koristiti debugger i tocno vidjeti sto se dogada? Ako ga ne znas koristiti, ovo ti je prilika da sto prije naucis, vjeruj mi jako se isplati, a i trebat ce ti u buducnosti cesto puta.
Napravio sam sve kako ste rekli ali mi se opet javlja ista stvar ne nudi mi da biram prvu kartu nego me direkt prebacuje na drugu.
Hm, ovo nije jos nitko predlozio koliko mi se cini, a ako i je, rijetko se predlozi, ali jesi li probao koristiti debugger i tocno vidjeti sto se dogada? Ako ga ne znas koristiti, ovo ti je prilika da sto prije naucis, vjeruj mi jako se isplati, a i trebat ce ti u buducnosti cesto puta.
Jeli moze pomoc oko toga jer nisam nikad koristio
Jeli moze pomoc oko toga jer nisam nikad koristio
Ovisi koji IDE koristis. Code::Blocks, DevCpp, Eclipse...?
Jeli moze pomoc oko toga jer nisam nikad koristio
Ovisi koji IDE koristis. Code::Blocks, DevCpp, Eclipse...?
DevC++
Hm, ovo nije jos nitko predlozio koliko mi se cini, a ako i je, rijetko se predlozi, ali jesi li probao koristiti debugger i tocno vidjeti sto se dogada? Ako ga ne znas koristiti, ovo ti je prilika da sto prije naucis, vjeruj mi jako se isplati, a i trebat ce ti u buducnosti cesto puta.
Slažem se. Debugger se ovdje često zanemaruje, a imam osjećaj i da ga dosta ljudi ne zna koristiti.
Jeli moze pomoc oko toga jer nisam nikad koristio
Prvo nam moraš reći koji IDE koristiš za programiranje. Neke stvari što se debuggiranja tiču su praktički univerzalne, ali detalji variraju od IDE-a do IDE-a.
Osnove su ti svugdje iste, postaviš breakpoint, označiš varijable čije vrijednosti želiš pratiti, i ideš korak po korak kroz program tražeći na kojoj liniji program počne raditi gluposti.
DevC++
Ok.
Tools -> Compiler options, prebaci na tab "Settings", lijevo odaberi "Linker", i onda desno "Generate debugging information" prebaci na "Yes" a "Strip executable" ako vec nije stavi na "No".
Nakon toga sa klikom na sivo područje lijevo od linije sa kodom postavljaš breakpoint. Breakpoint je točka na kojoj debugger usporava program i daje ti mogućnost da ideš korak po korak.
Nakon toga lupi F8, ili odaberi Debug->Debug.
Program će se izvršiti do breakpoint točke nakon čega se pauzira i čeka tvoje komande. Nakon toga ga pokrećeš korak po korak koristeći komande Step (tipka F7), Step into (tipka Shift+F7), Continue (Ctrl+F7) i Run to cursor (Shift+F4).
Htjeti ćeš vjerojatno i dodati varijablu koju želiš pratiti, to možeš učiniti tako da jednostavno dovedeš kursor miša iznad imena varijable bilo gdje u kodu i pričekaš malo, ili napraviš desni klik na to ime i odabereš "Add watch". Nakon čega će ti se varijabla i njena trenutna vrijednost pojaviti u "Debug" tabu sa lijeve strane (govorim o onom panelu sa tabovima "Project/Classes/Debug").
EDIT: Mislim da će netko trebati napraviti tutorial za to, fino sa slikicama na kojima se sve vidi i detaljnijim objašnjenjima. Možda budem i ja kasnije kada mi se bude dalo.
Napravio sam sve kako ste rekli ali mi se opet javlja ista stvar ne nudi mi da biram prvu kartu nego me direkt prebacuje na drugu.
Daj molim te napravi kako sam ti već napisao ponovovo
Ajde da ne čačkaš po dizajnu promjeni 57.liniju u ovo
int S[5] = {9,9,9,9,9}; /*iniciraj matricu uglavnom vecim brojevima od vrijednosti boja*/
i 56.liniju u
int R[5] = {19,19,19,19,19}; /*iniciraj matricu uglavnom vecim brojevima od vrijednosti karata*/
bez da išta ostalo diraš ,cijeli kod ostaje isti. Nije ti davao ovu ili onu kartu jer prije incijalizacije matrica u whlile uvjetima barataš sa za tebe garbage values , ne znaš šta je u tom trenu na recimo R[0] , R[1]......
while (S[0]<0 || S[0]>3) {
cout<<" Unesite boju prve karte:";
cin>> S[0];
imaš S[0] < 0 , možda trenutna vrijednost na memorijskoj adresi na tvom kompjuteru je u tom trenu 2.1234 , i main ide jer je zadovoljen uvjet a da se tebe nije ni pitalo.
INICIRAJ obje matrice R i S i mora ti raditi.
U ovom slučaju nema indicija za potrebom debuggera.
svejedno , kod mene
Continuing...
Program exited normally.
Debugger finished with status 0
savjet:
Još danas se riješi devC++ -a i stavi Code::Blocks 10.05
devC++ je stvar prošlosti već godinama.
Učini tako , bit ćeš iznenađen , to je moderan free compiler
EDIT
moderan IDE a ne compiler , u svakom slučaju učini to.