
Programiranje u C++-u - pitanja i odgovori


zbunjuje me jedna linija koda pa ako bi mi ju netko mogao pojasniti kako radi ili to nije potrebno?
for(j = i; j>=1 && polje[j-1] > pom; j--)
za ( j = i; ako je "j" manje ili jednako 1 i element polja na poziciji "j-1" veci od vrijednosti varijable pom; umanji "j" za 1)
jasno, petlja ce se izvrsavati sve dok je uvjet zadovoljen

@emerik
Sve je ispravno. Očito ne poznaješ insertion sort algoritam.
for(j = i; j>=1 && polje[j-1] > pom; j--)
Ovo je dio algoritma koji služi umetanju elementa na odgovarajuće mjesto u polju. Znači, kreće se od i-te pozicije u polju te se ide u lijevo (j--) sve dok je element koji se umeće manji od onog u polju (polje[j-1] > pom) ili dok se ne dođe do 1. elementa u polju (ispred nultnog nije moguće umetnuti element).

I meni se knjiga ne cini nesto dobra jer kad se vec koriste c++ objekte bilo bi dobro drzati se preporucenog nacina deklariranja varijabli
neposredno prije sto se koriste pogotovo za petlje jer se tako umanjuje njihov scope i smanji mogucnost greske, za for petlju npr.:
for( int index = 0; index < MAX; index--)
sto u ovom slucaju i nebi bilo zgodno jer je program napisan tako da koristi varijablu "i" na vise mjesta.
Takoder nije dobra praksa izostavljati viticaste zagrade pri koristenju petlji i koristenje imena varijabli koji nemaju veze sa njihovom funkcijom
ili sadrzajem, itd..

I meni se knjiga ne cini nesto dobra jer kad se vec koriste c++ objekte bilo bi dobro drzati se preporucenog nacina deklariranja varijabli
neposredno prije sto se koriste pogotovo za petlje jer se tako umanjuje njihov scope i smanji mogucnost greske, za for petlju npr.:
for( int index = 0; index < MAX; index--)
sto u ovom slucaju i nebi bilo zgodno jer je program napisan tako da koristi varijablu "i" na vise mjesta.
Takoder nije dobra praksa izostavljati viticaste zagrade pri koristenju petlji i koristenje imena varijabli koji nemaju veze sa njihovom funkcijom
ili sadrzajem, itd..
knjiga je dobra. Za viticaste zagrade sam ja kriv nisam ih prepisao.

...
knjiga je dobra. Za viticaste zagrade sam ja kriv nisam ih prepisao.
Hahaha, pa nemoj to raditi čovjeće, stičeš loše navike i prije nego što se naučis programirati kako spada

...
knjiga je dobra. Za viticaste zagrade sam ja kriv nisam ih prepisao.
Hahaha, pa nemoj to raditi čovjeće, stičeš loše navike i prije nego što se naučis programirati kako spada
hahaha nije mi se dalo xD bilo mi je vaznoa da saznam nacin funkcioniranja xD

Zna se čemu služe vitičaste zagrade i one nisu pravilo ako je riječ o jednoj naredbi. Eventualno, tek preporuka na početničkom nivou. Mislim da je uvijek sve u redu ako programer uredno piše code. Npr.
for(.......)
naredba;
for(......)
{
naredba1;
naredba2;
}
Znači, jasnim uvlačenjem coda korištenjem tab-a i sl. se uvijek dobije brz pregled. Zna se koji blok naredbi je ispod čega i kada se izvršava, bez obzira na vitičaste zagrade. Štoviše, ako se ovako piše code (uvlačenjem) onda se vrlo lako i detektira greška s vitičastim zagradama.

@Tracer,
Nisam ni rekao da je pravilo, nego dobra praksa. Ništa se ne gubi korištenjem zagrada kod petlji i uvjeta i kada je
samo jedna naredba ali ako mene pitas dobijes na jasnoci i konzistentnosti koda.
Na kraju krajeva svako pise kako njemu pase, nije nista oko cega se vrijedi prepirati

Ovako,program mi ispisuje prosječnu vrijednost kao cijeli broj,ako dolje kod izračunavanja prosječne vrijednosti ne stavim static_cast.Postoji neki drugi način kako dobiti float broj?Hvala.Trebate napraviti neku datoteku s brojevima pa probajte.
#include<iostream>#include<fstream>using namespace std;int main() { ifstream ulazniTok("brojevi.txt"); cout<<"Sadrzaj datoteke:"<<endl<<endl; float broj; int suma = 0; int BrojBrojeva = 0; while ((ulazniTok >> broj) != 0){ suma+=broj; BrojBrojeva++; cout<<broj<<endl; } float ProsjecnaVrijednost = static_cast<float>(suma)/static_cast<float>(BrojBrojeva); cout<<"U datoteci je bilo "<<BrojBrojeva<<" brojeva."<<endl; cout<<"Njihova prosjecna vrijednost je "<<ProsjecnaVrijednost<<endl; system("Pause"); return 0; }

Možeš castati samo jednog od njih:
float ProsjecnaVrijednost = static_cast<float>(suma)/BrojBrojeva;
ili u ovom slučaju možeš upotrijebiti i C casting:
float ProsjecnaVrijednost = (float)suma/BrojBrojeva;

Ima još jedna fora - pošto se radi o castovanju brojeva - jedan int u varijabli pomnožiš sa float brojnim tipom, naravno sa 1:
float prosjecnaVrijednost = (suma * 1.f)/(brojBrojeva);
p.s.
ovdje se radi o varijablama - dakle nazive bi trebalo počinjati sa malim slovom - dakle prosjecnaVrijednost ili brojBrojeva,
nije nikakva obveza, ali nekakva konvencija u c obitelji jezika jest:
camelCasing - ovaj način pisanja naziva se koristi za nazive varijabli i podatkovnih članova klasa,
a PascalCasing - dakle način gdje ime počinje velikim slovom - ProsjecnaVrijednst, BrojBrojeva se koristi kod pisanja naziva funkcija, metoda, svojstava i klasa.
nije obveza - ali je konvencija (sa ciljem jasnoće i preglednosti koda).

Može i ovako:
float prosjecnaVrijednost = (suma * 1.)/(brojBrojeva);

Može i ovako:
float prosjecnaVrijednost = (suma * 1.)/(brojBrojeva);
Naravno , cast sa double vrijednošću
međutim, manje bitno, onaj način koji si naveo je i najpraktičniji i najviše se koristi:
float prosjecnaVrijednost = (float)suma/brojBrojeva;
a ovo ostalo , sam naveo btw. ako već ima statički brojčani član.

a ovo ostalo , sam naveo btw. ako već ima statički brojčani član.
Kako misliš "statički"? Statičke varijable su nešto drugo..

a ovo ostalo , sam naveo btw. ako već ima statički brojčani član.
Kako misliš "statički"? Statičke varijable su nešto drugo..
Lapsus - sorry - kako god bilo const, static ili definirano kao define - varijabla ima ime
mislio sam na korištenje brojeva:
double rezultat = 5./nekiIntBroj;
ovdje ne dolazi do gubitka vrijednosti jer sam broj 5 odredio da je double broj, jer sam ga prikazao kao decimalnog.
my mistake

moram i ja nešto pitat, evo sinoć sam ponavlja kolekcije po predavanju sa DUMP-a pa sam rješava jedan zadatak,ugl upisuje se n brojeva,program mora nać najmanji i najveci u nizu brojeva i zamijenit im pozicije, dakle: ulaz- 5
26149
izlaz- 26941
znaći treba im zamijenit pozicije,ako je najveći bio prvi u nizu a najmanji zadnji to treba obrnut,sve sam ja to nakodirao i onda sam zapeo na zamjeni pozicija,pa sam se pomogao riješenim primjerom i dovršio zadatak,evo ovako izgleda:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
int temp,pozicijanajveceg,pozicijanajmanjeg;
int n;
int broj;
int min;
int max;
cout << "upisite koliko brojeva zelite unijeti" << endl;
cin >> n;
cout << "unesite brojeve" << endl;
vector <int> brojevi;
//petlja koja upisuje brojeve u vraća ih u vector
for (int i = 0; i < n; i++)
{
cin >> broj;
brojevi.push_back(broj);
}
min = brojevi[0];
// petlja koja traži minimum
for (int j=0; j<n; j++)
{
if(brojevi[j] < min)
{
min = brojevi[j];
pozicijanajmanjeg =j;
}
}
// petlja koja traži maximum
max = brojevi[0];
for (int k=0; k<n; k++)
{
if (brojevi[k] > max)
{
max = brojevi[k];
pozicijanajveceg = k;
}
}
//zamjena
temp = brojevi[pozicijanajveceg];
brojevi[pozicijanajveceg] = brojevi[pozicijanajmanjeg];
brojevi[pozicijanajmanjeg] = temp;
for (int e=0; e<n; e++)
{
cout << brojevi[e] << endl;
}
}
e sad ovaj dio koji je zacrnjen me zanima,dakle zamjena pozicija,naime zar ne bi bilo dovoljno napisat brojevi[pozicijanajveceg] = brojevi[pozicijanajmanjeg] i on ih zamijeni?? nego je napisan i ovaj dio gdje se pozicijanajveceg stavlja u privremenu varijablu i onda se pozicijanajmanjeg zamjenjuje tom varijablom,zar nije dovoljno samo jedno od to dvoje?? mislim ako ne shvaćam zašto je to tako mogu samo napamet naućit a to ne zelim.

hajmo ovak, imaš 2 varijable i moraš im zamjeniti mjesta
a = 10;
b= 50;
operator '=' postavlja vrijednost onoga što je desno njemu onom elementu koji je lijevo od njega, ako napišeš a=10;, operator '=' pridodaje vrijednost 10 varijabli a
znači kad bi išao zamjenjivati vrijednosti variable a i b, prema tvome bi ispalo a=b; što bi dalo rezultat da se vrijednost koja ima varijabla b postavi kao vrijednost varijable a, i dobio bi da je a=50; i b=50; što očito nije zamjenjeno
nego, trećom, privremenom varijablom, spremamo vrijednost a (a=10) u varijablu c, napravimo a=b; (a=50, b=50), i sada postavimo orginalnu vrijednost varijable a, koju smo spremili u privremenu varijablu c, na varijablu b, radeći b=c; i dobivamo rezultat a=50, b=10
slobodno sam probaj

Ovo gore je gotovo pa implementacija Selection sort algoritma. Tek male izmjene su potrebne...

hajmo ovak, imaš 2 varijable i moraš im zamjeniti mjesta
a = 10;
b= 50;
operator '=' postavlja vrijednost onoga što je desno njemu onom elementu koji je lijevo od njega, ako napišeš a=10;, operator '=' pridodaje vrijednost 10 varijabli a
znači kad bi išao zamjenjivati vrijednosti variable a i b, prema tvome bi ispalo a=b; što bi dalo rezultat da se vrijednost koja ima varijabla b postavi kao vrijednost varijable a, i dobio bi da je a=50; i b=50; što očito nije zamjenjeno
nego, trećom, privremenom varijablom, spremamo vrijednost a (a=10) u varijablu c, napravimo a=b; (a=50, b=50), i sada postavimo orginalnu vrijednost varijable a, koju smo spremili u privremenu varijablu c, na varijablu b, radeći b=c; i dobivamo rezultat a=50, b=10
slobodno sam probaj
pa da,logićno je ,hvala na objašnjenju ;)

Može pomoć? hitno, bitno ovako glasi zadatak:
Unesi recenicu od najvise 50 znakova. Ako se unese nešto osim velikih i malih slova te interpunkcijski znakova potrebno je ispisati grešku, inače ispiši rečenicu obrnutim redoslijedom.

Pomoć može, no rješenje ne. Pokaži koliko si napravio i gdje si zapeo.

void prvi(){
char tekst[50];
cout<<"Unesite recenicu:";
cin.getline(tekst,50);
int k=strlen(tekst);
for(int i=0;i<k;i++){
bool test=false;
if((int)tekst[i]>=65&&(int)tekst[i]<=90||(int)tekst[i]>=97&&(int)tekst[i]<=122){test=true;}
if(!test) cout<<"Greska"<<endl;
else goto ispis;}
ispis:for(int i=k-1;i>=0;i--) {
cout<<tekst[i];}
cout<<endl;
}
pokusavam zasad samo s uvijetom za slova pa ako je nesto drugo da izbaci grešku pa cu kasnije dodat za znakove al ovo ispisuje kao uvijek obrnuto, bez obzira koje znakove unesem

Može pomoć? hitno, bitno ovako glasi zadatak:
Unesi recenicu od najvise 50 znakova. Ako se unese nešto osim velikih i malih slova te interpunkcijski znakova potrebno je ispisati grešku, inače ispiši rečenicu obrnutim redoslijedom.
pomoći ću ti samo funkcijama koje trebaš ubaciti u if, ispunct > provjerava interpunkcije, isalpha > provjerava da li je alfabetic, ostalo možeš sam/a
edit: uf oprostite, zaboravio sam napomenuti da treba i ctype.h

Izbaci goto. Napravi zastavicu (varijablu) koju ćeš u petlji postaviti na 1 (true) ako naiđe na zabranjen znak, a na početku provjere ju postaviš na 0 (false). Nakon petlje provjeriš stanje zastavice (true ili false) te ispišeš što treba.

pokusavam zasad samo s uvijetom za slova pa ako je nesto drugo da izbaci grešku pa cu kasnije dodat za znakove al ovo ispisuje kao uvijek obrnuto, bez obzira koje znakove unesem
Uz ovo što ti je Tracer napisao, potrudi se malo oko indentacije - tj. lijeve margine. Ovo što si napravio je nečitljivo - vitičaste zagrade su ti na krivim mjestima - ne vidi se gdje je početak, a gdje kraj bloka. Ako ne znaš sam kako indentirati kôd (zapravo mi nije jasno kako ti je to tako ispalo, s obzirom da većina editora relativno OK stavlja razmake - samo prije } treba stisnuti Enter), onda koristi online beautifiere. Imaš recimo ovaj za JavaScript, ali savršeno može poslužiti i za ovakve jednostavne primjere za C/C++ (iako valja napomenuti da je AFAIK kod C/C++-a nepisana kovencija da se blok vitičastom zagradom otvara u novom redu, dok je kod Jave/JavaScripta da se otvara na kraju tekućeg reda).
Edit - vidim da si u ovom beautifieru za koji sam dao link sam možeš odrediti kamo će ti stavljati vitičanoste zagrade.

Kad smo vec kod toga, vidi ovo:
http://astyle.sourceforge.net/astyle.html#_Bracket_Style_Options
nisam ni sam znao da ih toliko ima, neki su mi bas bizarni...
Sto reci nego sto ljudi - sto cudi...

Kad smo vec kod toga, vidi ovo:
http://astyle.sourceforge.net/astyle.html#_Bracket_Style_Options
nisam ni sam znao da ih toliko ima, neki su mi bas bizarni...
Bome nisam ni ja znao.

Kad smo vec kod toga, vidi ovo:
http://astyle.sourceforge.net/astyle.html#_Bracket_Style_Options
nisam ni sam znao da ih toliko ima, neki su mi bas bizarni...
Sto reci nego sto ljudi - sto cudi...
LOL, kad smo već kod toga, nisam ni ja znao , al samoinicijativno pišem Allman stilom (do sad nisam ni znal da se tak zove).

hmm a stil gdje se takav kratak if natrpa u jedan red zbog meni osobno bolje preglednosti?
edit: hmm čini se da pišem najsličnije horstmannovom stilu x)
Niti j nije inicijaliziran.Koju to knjigu imaš?