Programiranje

Programiranje u C++-u - pitanja i odgovori

drnde uto 23.8.2011 19:43
unknown kaže...

 

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

TracerCPP uto 23.8.2011 19:48

@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).

drnde uto 23.8.2011 19:59

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..

unknown uto 23.8.2011 20:03
drnde kaže...

 

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.

drnde uto 23.8.2011 20:09
unknown kaže...
drnde kaže...

 

...

 

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 {#}

unknown uto 23.8.2011 20:11
drnde kaže...
unknown kaže...
drnde kaže...

 

...

 

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 

 

TracerCPP uto 23.8.2011 20:14

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.

 

drnde uto 23.8.2011 20:34

@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 {#}

Ivan_99C++ sub 27.8.2011 16:01

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;      }

TracerCPP sub 27.8.2011 16:04

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;

Floki ned 28.8.2011 12:29

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).

Floki ned 28.8.2011 14:52
TracerCPP kaže...

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.

Floki ned 28.8.2011 15:10
TracerCPP kaže...
Floki kaže...

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

athlon64 uto 30.8.2011 13:01

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.

munjovoz uto 30.8.2011 13:12

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

athlon64 uto 30.8.2011 13:34
munjovoz kaže...

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 ;)

Delilah uto 30.8.2011 22:03

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.

 

Delilah uto 30.8.2011 22:15

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

munjovoz uto 30.8.2011 22:16
Delilah kaže...

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

 

izvor

 

edit: uf oprostite, zaboravio sam napomenuti da treba i ctype.h

TracerCPP uto 30.8.2011 22:22

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.

mbaksa uto 30.8.2011 22:51
Delilah kaže...

 

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.